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
相关产品推荐
相关产品推荐

