You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java ZoneID是否始终能解析已更名的旧时区ID?

时区ID更名与Java兼容性问题

2022年末,IANA将时区Europe/Kiev更名为Europe/Kyiv。

请参考以下程序:

import java.time.ZoneId;

public class TZPlay {
  public static void main(String[] args) {
    try {
//      ZoneId.of("Europe/Kiev"); // 在Java 17.06和Java 17.03中均可运行
//      ZoneId.of("Europe/Kyiv"); // 在Java 17.06中可运行,但Java 17.03中不行
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

测试观察

  • Java 17.03解析Europe/Kyiv时抛出如下异常:
java.time.zone.ZoneRulesException: Unknown time-zone ID: Europe/Kyiv
        at java.base/java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:280)
        at java.base/java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:235)
        at java.base/java.time.ZoneRegion.ofId(ZoneRegion.java:121)
        at java.base/java.time.ZoneId.of(ZoneId.java:410)
        at java.base/java.time.ZoneId.of(ZoneId.java:358)
        at TZPlay.main(TZPlay.java:7)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:419)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
  • Java 17.06可正常解析Europe/Kyiv且无异常。
  • 此外,Java 17.06也能正常解析Europe/Kiev。

从上述案例来看,新版本Java似乎能解析已更名的旧时区ID。

这种兼容性是否有官方保障?还是旧时区ID可能在后续Java小版本中失效?

我在ZoneId官方文档中搜索了“previous”“old”“rename”等关键词,但未找到明确说明。


内容的提问来源于stack exchange,提问作者merlin2011

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:40:13