Java 8时区ZoneRulesException:未知时区ID:EST

时间:2019-08-12 21:24:13

标签: java timezone

“ EST”是TimeZone.getAvailableIDs();中的timeZone ID之一。

但是

C:\Users\pla>netstat -qfa | findstr host
 TCP    10.0.0.1:##87     host.abc.nt:4096  ESTABLISHED

java.time.zone.ZoneRulesException:未知时区ID:EST

3 个答案:

答案 0 :(得分:5)

来自the Javadoc of TimeZone

  

三个字母的时区ID

     

为了与JDK 1.1.x兼容,还支持其他三个字母的时区ID(例如“ PST”,“ CTT”,“ AST”)。但是,不赞成使用它们,因为通常在多个时区使用相同的缩写(例如,“ CST”可以是美国的“ Central Standard Time”和“ China Standard Time”),并且Java平台只能识别以下一种他们。

ZoneIdTimeZone不同,并删除了这些有问题的时区。

如果这就是您的意思,请改用America/New_York

答案 1 :(得分:2)

您正在混合新旧API。

TimeZone.getAvailableIDs()返回TimeZone.getTimeZone(String ID)可以解析的时区ID。

ZoneId.getAvailableZoneIds()返回ZoneId.of(String zoneId)可以解析的区域ID。

如果比较2的结果,则会看到:

public static void main(String[] args) {
    Set<String> timeZones = Set.of(TimeZone.getAvailableIDs());
    Set<String> zoneIds = ZoneId.getAvailableZoneIds();
    System.out.println("Extra TimeZone's: " + diff(timeZones, zoneIds));
    System.out.println("Extra ZoneId's: " + diff(zoneIds, timeZones));
}
static Set<String> diff(Set<String> a, Set<String> b) {
    Set<String> diff = new TreeSet<>(a);
    diff.removeAll(b);
    return diff;
}

输出(jdk-11.0.1)

Extra TimeZone's: [ACT, AET, AGT, ART, AST, BET, BST, CAT, CNT, CST, CTT, EAT, ECT, EST, HST, IET, IST, JST, MIT, MST, NET, NST, PLT, PNT, PRT, PST, SST, VST]
Extra ZoneId's: []

如您所见,ZoneId.getAvailableZoneIds()不声称支持EST,只有TimeZone.getAvailableIDs()支持。

答案 2 :(得分:2)

尝试一下:

ZoneId.of("EST", ZoneId.SHORT_IDS);

说明:ZoneID.SHORT_IDS将已弃用的3个字母的代码映射为常规的3个字母的代码,出于某种原因,必须明确指定它才能生效。

在JDK javadoc中:“在TimeZone中已不再使用短区域ID”。