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

Sun*_*day 0 java timezone

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

TimeZone.getAvailableIDs();  // contains EST
ZoneId.of("EST")
Run Code Online (Sandbox Code Playgroud)

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

And*_*eas 6

您正在混合新旧 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;
}
Run Code Online (Sandbox Code Playgroud)

输出 (jdk-11.0.1)

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;
}
Run Code Online (Sandbox Code Playgroud)

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


mar*_*ins 6

尝试这个:

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

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

来自 JDK javadoc:“TimeZone 中不推荐使用短区域 ID”。

  • 请在您的答案中添加一些解释,以便其他人可以从中学习 (2认同)

And*_*ner 5

来自的JavadocTimeZone

三字母时区ID

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

ZoneId与有所不同TimeZone,并删除了这些有问题的时区。

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