tl;博士
- 不要使用类(现在是
TimeZone
旧版)。
- 使用
ZoneOffset
andZoneId
代替。
例子:
ZoneOffset.of( "+08:00" )
使用java.time.ZoneId
,而不是TimeZone
与 Java 的最早版本捆绑在一起的麻烦的旧日期时间类现在是遗留的,被 java.time 类所取代。在这些旧的遗留类中,现在被andTimeZone
取代。ZoneId
ZoneOffset
与 UTC的偏移是在 UTC之前或之后调整的小时数和分钟数。这由ZoneOffset
类表示。
时区是偏移量的集合,特定区域用于确定其挂钟时间的偏移量变化历史。这由ZoneId
类表示。
使用时区总是比偏移量更可取,因为区域具有偏移量以及更多信息。但是您的示例只是偏移量。所以ZoneOffset
在删除字符后使用 来解析字符串UTC
。
String input = "UTC+08:00".replace( "UTC" , "" ) ;
ZoneOffset offset = ZoneOffset.of( input ) ;
不要猜测时区
您不能假设特定的偏移量意味着特定的时区。许多区域可能在过去、现在或将来使用了特定的偏移量。所以你不应该猜测区域。
以 的偏移量为例+08:00
。该偏移量目前被几个不同的时区使用,包括Asia/Shangai
、Asia/Macao
和Australia/Perth
。
如果您确定某个特定区域用于日期时间值,请将其应用以获取ZonedDateTime
. 但不要猜测。
该类Instant
表示 UTC 时间线上的一个时刻,分辨率为纳秒。
Instant instant = Instant.now() ;
ZoneId z = ZoneId.of( "Asia/Shanghai" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
如果您不确定预期的时区并且只有一个偏移量,请使用偏移量来获取OffsetDateTime
.
Instant instant = Instant.now() ;
ZoneOffset offset = ZoneOffset.of( "+08:00" ) ;
OffsetDateTime odt = instant.atOffset( offset ) ;
兑换
最好避免旧的遗留类TimeZone
。但是,如果您必须使用该类来处理尚未为 java.time 类更新的旧代码,您可以转换为/从ZoneId
. 使用添加到旧类的新转换方法。
TimeZone myLegacyTimeZone = TimeZone.getTimeZone( myModernZoneId );
…和…
ZoneId z = myLegacyTimeZone.toZoneId() ;
请注意,它ZoneOffset
是 的子类ZoneId
。通常,我们忽略这种继承关系。如果您只有一个偏移量,例如+08:00
,请使用ZoneOffset
. 如果您有完整的时区,例如Asia/Shanghai
,请使用ZoneId
. 该规则的一个例外是这种到/从只识别TimeZone
超类的转换。ZoneId