tl; dr
使用java.time.Instant
class解析标准ISO 8601格式的文本,以UTC表示时刻。
Instant.parse( "2010-10-02T12:23:23Z" )
ISO 8601
该格式由ISO 8601标准针对日期时间字符串格式定义。
都:
…默认情况下,使用ISO 8601格式来解析和生成字符串。
通常,您应该避免使用旧的java.util.Date /.Calendar和java.text.SimpleDateFormat类,因为它们非常麻烦,令人困惑且存在缺陷。如果需要进行互操作,则可以往返。
java.time
新的java.time框架内置于Java 8及更高版本中。受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.
转换为旧类。请注意,分配的时区在转换中丢失,因为无法为juDate分配时区。
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-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。