tl;博士
Instant.parse( "2011-05-03T11:58:01Z" )
国际标准化组织 ISO 8601
实际上,RFC 3339只是实际标准ISO 8601的自我声明的“配置文件”。
RFC的不同之处在于,它故意违反ISO 8601,允许零小时()的负偏移量,并赋予其“偏移未知”的语义含义。这种语义对我来说似乎是一个非常糟糕的主意。我建议坚持更明智的ISO 8601规则。在ISO 8601中,完全没有偏移量意味着偏移量是未知的 - 这是一个明显的含义,而RFC规则是晦涩难懂的。-00:00
现代 java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。
输入字符串表示 UTC 中的某个时刻。末尾是 UTC 的缩写,表示 UTC。Z
Zulu
Instant
(不是Date
)
现代类表示 UTC 中的某个时刻。此类替换 java.util.Date
,并使用纳秒而不是毫秒的更精细分辨率。Instant
Instant instant = Instant.parse( "2011-05-03T11:58:01Z" ) ;
ZonedDateTime
(不是Calendar
)
要通过某个地区(时区)的人们使用的挂钟时间查看相同的时刻,请应用 a 以获取 .此类将替换 java.util.Calendar
类。ZoneId
ZonedDateTime
ZonedDateTime
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, same point on the timeline, different wall-clock time.
转换
我强烈建议尽可能避免使用旧版日期时间类。但是,如果您必须与尚未更新到java.time的旧代码进行互操作,则可以来回转换。调用添加到旧类的新方法。
Instant
取代。java.util.Date
java.util.Date myJUDate = java.util.Date.from( instant ) ; // From modern to legacy.
Instant instant = myJUDate.toInstant() ; // From legacy to modern.
ZonedDateTime
取代。GregorianCalendar
java.util.GregorianCalendar myGregCal = java.util.GregorianCalendar.from( zdt ) ; // From modern to legacy.
ZonedDateTime zdt = myGregCal.toZonedDateTime() ; // From legacy to modern.
如果你有一个,那实际上是一个,cast。java.util.Calendar
GregorianCalendar
java.util.GregorianCalendar myGregCal = ( java.util.GregorianCalendar ) myCal ; // Cast to the concrete class.
ZonedDateTime zdt = myGregCal.toZonedDateTime() ; // From legacy to modern.
项目符号关注
关于您问题的具体问题...
java.time 类内置于 Java 8、9、10 及更高版本中。一个实现也包含在后来的Android中。对于早期的Java和早期的Android,请参阅本答案的下一节。
各种java.time类处理我所知道的每一种ISO 8601格式。他们甚至处理一些神秘地从后来的标准版本中消失的格式。
有关其他格式,请参阅各种类(如 、等)的 和 方法。另外,搜索堆栈溢出,因为有很多关于这个主题的示例和讨论。parse
toString
LocalDate
OffsetDateTime
- 字符串应该能够轻松验证以查看它是否是有效的 RFC 3339 日期
若要验证输入字符串,请为 DateTimeParseException 陷印
。
try {
Instant instant = Instant.parse( "2011-05-03T11:58:01Z" ) ;
} catch ( DateTimeParseException e ) {
… handle invalid input
}
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。