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

Java 使用时区和ZoneId类的时区ID之间的差异,java,java-8,Java,Java 8,在我的程序中,用户可以从我从TimeZone.getAvailableIDs()获取的ID列表中选择时区。这个ID存储在数据库中,稍后我使用ZoneId.of(String ZoneId)获取ZoneId对象 但是今天在调试时,我意识到由TimeZone.getAvailableIDs()生成的一些ID不能被ZoneId.of(String ZoneId)识别,并抛出了一个“java.time.zoneRuleException”。例如,ZoneId.of(“EAT”)抛出异常 ZoneId类本

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

但是今天在调试时,我意识到由
TimeZone.getAvailableIDs()
生成的一些ID不能被
ZoneId.of(String ZoneId)
识别,并抛出了一个“java.time.zoneRuleException”。例如,
ZoneId.of(“EAT”)
抛出异常

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

有人能给我解释一下区别吗?为什么我会得到两个不同的区域ID列表

我使用Java8

在java.util.TimeZone中不推荐使用短区ID。这 map允许通过(字符串,map)的
继续使用ID
工厂法

因此,您应该使用同一方法的不同签名

ZoneId.of("EAT", ZoneId.SHORT_IDS)
或者你可以使用全名

ZoneId.of("Africa/Addis_Ababa")

谢谢你的澄清。我刚刚检查了一下,
ZoneId.getAvailableZoneIds()
TimeZone.getAvailableIDs()
之间的差异只有28个三位数的ID(EST、HST、MST、ACT、AET、AGT、ART、AST、BET、BST、CAT、CNT、CST、CTT、EAT、ECT、IET、IST、JST、MIT、NET、NST、PLT、PNT、PRT、PST、SST、VST)。其余条目完全匹配。