为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2023-06-04 15:30:02
“EST”是来自 TimeZone.getAvailableIDs() 的时区 ID 之一;但TimeZone.getAvailableIDs();  // contains EST ZoneId.of("EST")java.time.zone.ZoneRulesException:未知时区 ID:EST
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

尝试这个:

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

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

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


查看完整回答
反对 回复 2023-06-04
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

您正在混合使用新旧 API。

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

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

如果比较 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()支持。


查看完整回答
反对 回复 2023-06-04
?
跃然一笑

TA贡献1826条经验 获得超6个赞

来自JavadocTimeZone

三字母时区 ID

为了与 JDK 1.1.x 兼容,还支持其他一些三字母时区 ID(例如“PST”、“CTT”、“AST”)。但是,它们的使用已被弃用,因为同一个缩写经常用于多个时区(例如,“CST”可能是美国“中部标准时间”和“中国标准时间”),Java 平台只能识别其中一个他们。

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

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


查看完整回答
反对 回复 2023-06-04
  • 3 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信