java.time.zone.ZoneRulesException: Unknown time-zone ID: Europe/Kyiv
at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
at java.time.ZoneRegion.ofId(ZoneRegion.java:120)
at java.time.ZoneId.of(ZoneId.java:411)
at java.time.ZoneId.of(ZoneId.java:359)
异常代码,原因是找不到Europe/Kyiv这个时区,原来我以为是linux系统中没有这个时区,然后添加这个时区后,发现问题还在。最后在看java.time.zone.ZoneRulesProvider类找发现了一行,String prop = System.getProperty("java.time.zone.DefaultZoneRulesProvider");时区是读这个环境变量的,在网上找一找后发现了可以改这个环境变量,或者还可以修改jre/lib/tzdb.dat这个时区数据库,用这tzdb.dat这个一搜索,发现oracle有一个Timezone Updater Tool叫TZUpdater.jar,运行一下就更新了,需要指定IANA时区数据库。
接下来就是下载TZUpdater.jar,oracle下载地址太难找了,收藏一下先。
好了,看一下怎么用吧,
TZUpdater 工具用法
TZUpdater 工具用于执行该工具的 JDK/JRE 软件实例。每次执行都会修改 JDK/JRE 软件。要将工具管理到 JDK/JRE 软件的多个实例。
在安装的 JDK/JRE 软件上运行 TZUpdater 工具之前,您必须停止操作系统上的 JDK/JRE 软件的任何正在运行的服务。
使用以下命令运行 TZUpdater 工具:
java -jar tzupdater.jar options
1
要成功更新时区数据,您应该确保您有足够的权限来修改JDK_HOME /jre/lib或JRE_HOME /lib目录。
如果未指定任何选项,则会显示用法消息。要更新时区数据,请使用-l或-f选项。
选项 描述
-h, --help
将用法打印到stdout并退出。如果指定此选项,则其他选项将被忽略。
-V, --version 打印工具版本、JRE 中的 tzdata 版本以及工具将更新到的 tzdata 版本,然后退出。
-l, --location url-link-to-archive-file 从提供的tzdata.tar.gz包中编译、测试和更新 JRE 时区数据,例如-l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz. 支持的 URL 协议:http://、https://、file://。如果未提供 URL 链接,该工具将使用位于 的最新 IANA tzdata 包https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz。
-f, --force 强制 tzdata 更新。如果更新到较旧的 tzdata 版本,请使用此选项。
-v, --verbose 向 显示详细消息stdout。
好吧,其实就一句话:
java -jar tzupdater.jar -l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
这样就已经搞定了,
下面再介绍一下,怎么更新linux的时区数据库吧,linux里面也没有Europe/Kyiv。
linux系统中没有这个时区,可以通过命令:timedatectl list-timezones | grep -i europe,查看欧洲的时区。
现在就是要添加这个区:
添加新的时区,可以从IANA时区数据库中下载最新的时区信息。最新的时区数据库可以在IANA官方网站上找到。您可以在该网站上找到一个名为tzdata的.tar.gz文件,该文件包含了最新的时区数据。您可以将该文件下载到您的Linux系统上,放到/usr/share/zoneinfo/文件夹中,然后使用以下命令将其解压缩:
tar -xvf tzdata.tar.gz
最后使用timedatectl list-timezones | grep -i europe再次查看,已经有了。