tl;博士
使用类分析标准 ISO 8601 格式的文本,表示 UTC 中的某个时刻。java.time.Instant
Instant.parse( "2010-10-02T12:23:23Z" )
国际标准化组织 ISO 8601
该格式由 ISO 8601 日期时间字符串格式标准定义。
双:
...默认情况下,使用 ISO 8601 格式进行解析和生成字符串。
您通常应该避免使用旧的java.util.Date/。Calendar和java.text.SimpleDateFormat类,因为它们是出了名的麻烦,令人困惑和有缺陷的。如果需要互操作,可以来回转换。
java.time
Java 8及更高版本中内置的是新的java.time框架。灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展。
Instant instant = Instant.parse( "2010-10-02T12:23:23Z" ); // `Instant` is always in UTC.
转换为旧类。
java.util.Date date = java.util.Date.from( instant ); // Pass an `Instant` to the `from` method.
时区
如果需要,您可以指定时区。
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
转换。
java.util.Date date = java.util.Date.from( zdt.toInstant() ); // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.
城大时间
更新:Joda-Time项目现在处于维护模式。该团队建议迁移到 java.time 类。
下面是 Joda-Time 2.8 中的一些示例代码。
org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC ); // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.
转换为旧类。请注意,分配的时区在转换过程中会丢失,因为无法为 j.u.Date 分配时区。
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
时区
如果需要,您可以指定时区。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
关于 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
等。