tl;博士
OffsetDateTime.parse( "2015-10-27T16:22:27.605-07:00" )
.toInstant()
.toString()
2015-10-27T23:22:27.605Z
详情
您的问题不明确和具体。也许这些小例子会有所帮助。将旧的 java.util.Date 和 .Calendar 类与 Joda-Time 混合使用可能会让您感到困惑。 Joda-Time 完全替换那些类而不是增加。
java.time
现代的 java.time 类取代了 Java 中遗留的日期时间类以及提供灵感的 Joda-Time 库。
OffsetDateTime
OffsetDateTime 类表示时间轴上的一个时刻,其与 UTC 的特定偏移量决定了它的挂钟时间。
java.time 类在解析/生成字符串时默认使用标准的ISO 8601 格式。所以不需要指定格式模式。
OffsetDateTime odt = OffsetDateTime.parse( "2015-10-27T16:22:27.605-07:00" ) ;
Instant
要从 UTC 后 7 小时的偏移量调整到 UTC 本身,我们需要在时间上增加 7 小时,并在需要时翻转日期。 OffsetDateTime 类可以为我们完成这项工作。使用 ZoneOffset.UTC 常量指定 UTC。
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;
odtUtc.toString(): 2015-10-27T23:22:27.605Z
如果您在代码中大量使用此 UTC 值,并且通常应该如此,那么您可能会发现使用 Instant 对象更清晰。根据定义,Instant总是在 UTC 中。我们可以从OffsetDateTime 中提取一个Instant。
Instant instant = odt.toInstant() ;
instant.toString(): 2015-10-27T23:22:27.605Z
请注意,我们上面的所有三个对象(odt、odtUtc、instant)都代表相同的同时时刻,时间轴上的相同点。唯一不同的是他们的挂钟时间。
ZonedDateTime
顺便说一句,如果您想看到同一时刻调整到某个地区的人们使用的挂钟时间,请通过ZoneId 指定时区以获取ZonedDateTime 对象。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
zdt.toString(): 2015-10-27T19:22:27.605-04:00[美国/蒙特利尔]
在java.time中使用具体类
Answer by always_a_rookie_to_learn 与上述方法类似,但使用接口TemporalAccessor。通常,在 Java 中使用更高的接口和超类是一个好主意。但不是在这里。 java.time 文档解释说,他们的设计旨在让我们在应用程序中使用较低的更具体的类。通常,这些抽象仅供框架内部使用。
在这个问题的具体情况下,OffsetDateTime 类是合适的,而不是TemporalAccessor。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
乔达时间
更新:Joda-Time 项目处于维护模式,它建议迁移到 java.time 类。此部分保留完整的历史记录。
对于字符串,Joda-Time 默认为ISO 8601,包括解析和生成。 Joda-Time 具有 ISO 8601 的内置默认解析器,因此只需将您的兼容字符串传递给构造函数或静态 parse 方法。
java.util.Date date = new DateTime( "2010-01-01T12:00:00+01:00Z" ).toDate();
尽可能避免使用 java.util.Date 和 .Calendar,并坚持使用 Joda-Time 和 DateTime 等类。仅在其他类需要时使用 .Date。
DateTime dateTimeUtc = new DateTime( someJavaDotUtilDotDate, DateTimeZone.UTC ); // Joda-Time can convert from java.util.Date type which has no time zone.
String output = dateTime.toString(); // Defaults to ISO 8601 format.
DateTime dateTimeUtc2 = new DateTime( output, DateTimeZone.UTC ); // Joda-Time can parse ISO 8601 strings.
为了演示,调整到用户期望的时区。
DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" ) );