tl;博士
OffsetDateTime
.parse(
"2012-10-30T22:30:00+0300" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" )
)
.toInstant()
.atZone(
ZoneId.of( "Europe/London" )
)
.toString()
2012-10-30T19:30Z[欧洲/伦敦]
java.time
现代解决方案使用 java.time 类。
定义格式化程序以匹配您的输入。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" ) ;
将输入解析为OffsetDateTime。
String input = "2012-11-05T13:00:00+0200" ;
OffsetDateTime odt = OffsetDateTime.parse( input , f );
odt.toString(): 2012-11-05T13:00+02:00
提示:始终在偏移的小时和分钟之间包含冒号字符作为分隔符。然后我们可以跳过自定义格式模式:OffsetDateTime.parse( "2012-11-05T13:00+02:00" )。
通过提取 Instant 对象来调整到 UTC,即零时分秒的偏移量。
Instant instant = odt.toInstant() ;
在标准 ISO 8601 格式中,末尾的 Z 表示 UTC(零偏移)。发音为“祖鲁语”。
instant.toString(): 2012-11-05T11:00:00Z
调整到伦敦时间。
ZoneId zLondon = ZoneId.of( "Europe/London" ) ;
ZonedDateTime zdtLondon = instant.atZone( zLondon ) ;
zdtLondon.toString(): 2012-11-05T11:00Z[欧洲/伦敦]
调整到另一个时区。
ZoneId zMontreal = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtMontreal = instant.atZone( zMontreal );
zdtMontreal.toString(): 2012-11-05T06:00-05:00[美国/蒙特利尔]
所有这些对象(odt、instant、zdtLondon 和 zdtMontreal)都代表同一时刻,时间轴上的同一点。同一时刻,不同的挂钟时间。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time。
从哪里获得 java.time 类?
https://i.stack.imgur.com/eKgbN.png
哪个 java.time 库与哪个版本的 Java 或 Android 一起使用的表
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。