使用 TimeZone 和 ZoneId 类的时区 ID 之间的差异

beh*_*zad 5 java java-8

在我的程序中,用户可以从我获得的 ID 列表中选择时区TimeZone.getAvailableIDs()。该 ID 存储在数据库中,稍后我用它ZoneId.of(String zoneId)来获取 ZoneId 对象。

但今天在调试时,我意识到 生成的一些 IDTimeZone.getAvailableIDs()无法识别ZoneId.of(String zoneId),并抛出“java.time.zone.ZoneRulesException”。例如ZoneId.of("EAT")抛出异常。

该类ZoneId本身可以使用 生成区域 ID 列表ZoneId.getAvailableZoneIds()。这会为我返回 599 个 ID,但TimeZone.getAvailableIDs()会返回 627 个 ID。

有人可以向我解释一下其中的区别吗?为什么我会得到 2 个不同的区域 ID 列表?

我使用Java 8。

Mic*_*ael 5

来自ZoneId 的文档

java.util.TimeZone 中已弃用短区域 ID 的使用。该映射允许继续通过工厂方法使用 ID of(String, Map)

所以你应该使用相同方法的不同签名

ZoneId.of("EAT", ZoneId.SHORT_IDS)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用全名

ZoneId.of("Africa/Addis_Ababa")
Run Code Online (Sandbox Code Playgroud)