Java 8u222中ZonedDateTime.parse解析特定时区字符串报错求助
问题解惑:Java 8u222解析
Asia/Qostanay时区报错的原因及解决办法 这个问题本质是JDK内置的IANA时区数据库版本不兼容导致的,我来给你拆解清楚:
核心原因
Java的ZonedDateTime解析时区ID时,依赖的是JDK自带的IANA时区数据库(tzdata)。而Asia/Qostanay这个时区ID是在较新的tzdata版本中才被纳入的:
- Java 8u222发布于2019年10月,内置的tzdata版本为2019c,此时
Asia/Qostanay还未被加入时区数据库; - 你测试的
Europe/Busingen、Asia/Ulan_Bator这类时区ID是很早就存在于tzdata中的,所以能被正常识别。
你可以快速验证这一点:在Java 8u222里执行ZoneId.of("Asia/Qostanay"),会直接抛出java.time.zone.ZoneRulesException: Unknown time-zone ID: Asia/Qostanay——这说明JDK根本不认识这个时区ID,自然没法完成ZonedDateTime的解析。
解决办法
针对这个问题,有三种可行的解决路径:
1. 更新JDK的时区数据库
使用Oracle提供的tzupdater工具,手动把JDK的tzdata更新到包含Asia/Qostanay的版本(比如tzdata 2020a及以上)。执行步骤大致是:
- 下载tzupdater工具;
- 运行命令:
java -jar tzupdater.jar -l(自动拉取并安装最新时区数据)
2. 替换为兼容的旧时区ID
如果暂时没法更新时区数据,可以用Asia/Qostanay对应的旧时区ID替代。该时区在早期tzdata中使用的是Asia/Kostanay,你可以把解析字符串改成:
ZonedDateTime.parse("2011-07-03T02:20:46+06:00[Asia/Kostanay]")
这个ID在Java 8u222中是可以正常识别的。
3. 升级JDK版本
直接把JDK升级到Java 8u261及以上版本(该版本内置tzdata 2020a),或者更高版本的Java(比如Java 11+),这些版本已经原生支持Asia/Qostanay时区ID。
内容的提问来源于stack exchange,提问作者Fernando Barbeiro
相关产品推荐
相关产品推荐

