gpt4 book ai didi

java - 如何将时区字符串转换为 Java 中的 TimeZone 对象?

转载 作者:行者123 更新时间:2023-11-30 06:06:31 31 4
gpt4 key购买 nike

我有几个UTC格式的时区字符串,比如"UTC+08:00", "UTC-05:00",问题是如何将这些utc格式的字符串转换成Java 中的 java.util.TimeZone

我尝试按如下方式通过 ZoneId 进行转换,但没有成功:

ZoneId zoneId = ZoneId.of("UTC+08:00");
TimeZone timeZone = TimeZone.getTimeZone(zoneId);

我知道 TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai"); 可以,但我不知道 "UTC+08:00" 之间的映射> 和 “亚洲/上海”

最佳答案

tl;dr

  • 不要使用TimeZone 类(现在是旧版)。
  • 改用 ZoneOffsetZoneId

例子:

ZoneOffset.of( "+08:00" )

使用java.time.ZoneId,而不是TimeZone

与最早版本的 Java 捆绑在一起的麻烦的旧日期时间类现在已经遗留,被 java.time 类所取代。在这些旧的遗留类中有 TimeZone,现在被 ZoneId 取代了和 ZoneOffset .

offset-from-UTC是在 UTC 之前或之后调整的小时数和分钟数.这由 ZoneOffset 类表示。

A time zone是偏移量的集合,特定区域在确定其挂钟时间时使用的偏移量变化历史。这由 ZoneId 类表示。

使用时区总是优于偏移量,因为时区具有偏移量以及更多信息。但是你的例子只是抵消。所以使用ZoneOffset来解析删除字符UTC后的字符串。

String input = "UTC+08:00".replace( "UTC" , "" ) ;
ZoneOffset offset = ZoneOffset.of( input ) ;

不要猜测时区

您不能假设特定的偏移量意味着特定的时区。许多区域可能在过去、现在或将来使用了特定的偏移量。所以你不应该猜测区域。

例如,+08:00 的偏移量。该偏移量当前由 several different time zones 使用包括亚洲/上海亚洲/澳门澳大利亚/珀斯

如果您确定某个特定区域用于日期时间值,请应用它以获得 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() ;

注意 ZoneOffsetZoneId 的子类。通常,我们会忽略这种继承关系。如果您只有一个偏移量,例如 +08:00,请使用 ZoneOffset。如果您有一个完整的时区,例如 Asia/Shanghai,请使用 ZoneId。此规则的一个异常(exception)是与 TimeZone 之间的这种转换,其中仅识别父类(super class) ZoneId

关于java - 如何将时区字符串转换为 Java 中的 TimeZone 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43820248/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com