高级JAVA开发必备技能:时区的规则发生变化时,如何同步JDK的时区规则(实战方案,建议收藏)

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级JAVA开发必备技能:时区的规则发生变化时,如何同步JDK的时区规则(实战方案,建议收藏)相关的知识,希望对你有一定的参考价值。

技术活,该赏
点赞,收藏再看,养成习惯

场景

服务器安装JDK时,默认会有支持JDK版本对应的时区规则。但是时区规则可能会变化的,那如何保持时区规则是最新的呢?

TZUpdater 工具介绍

​ 提供的 TZUpdater 工具 允许您使用更新的时区数据更新已安装的 Java 开发工具包 (JDK) 和 Java 运行时环境 (JRE) 软件,以适应不同国家/地区的夏令时 (DST) 更改。Oracle 依赖于通过 IANA 的时区数据库公开提供的时区数据。

如果您无法使用 Oracle 最新的 JDK 或 JRE 更新版本,或者如果最新版本上的时区数据不是最新可用的,TZUpdater 工具提供了一种更新时区数据的方法,同时保持其他系统配置和依赖项不变.

TZUpdater 工具用法

TZUpdater 工具用于执行该工具的 JDK/JRE 软件实例。每次执行都会修改 JDK/JRE 软件。要将工具管理到 JDK/JRE 软件的多个实例。

在安装的 JDK/JRE 软件上运行 TZUpdater 工具之前,您必须停止操作系统上的 JDK/JRE 软件的任何正在运行的服务。

使用以下命令运行 TZUpdater 工具:

java -jar tzupdater.jar options

要成功更新时区数据,您应该确保您有足够的权限来修改JDK_HOME /jre/libJRE_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

手动升级

注意:

1、在安装的 JDK/JRE 软件上运行 TZUpdater 工具之前,您必须停止操作系统上的 JDK/JRE 软件的任何正在运行的服务。

2、要成功更新时区数据,您应该确保您有足够的权限来修改JDK_HOME /jre/libJRE_HOME /lib目录。(linux系统:JRE目录要有写权限;windows系统:用管理员身份运行cmd)

3、如果系统上有多个JDK/JRE ,需要将该工具用于每个JDK/JRE中(每个JDK/JRE都要操作一遍)

4、更新成功后,要重新启动此 JDK/JRE 实例上的应用程序服务(如果还没更新,重启下服务器试试)

操作步骤:

1、下载Oracle官方提供的tzupdater.jar包;下载地址

https://www.oracle.com/java/technologies/javase-tzupdater-downloads.html

把tzupdater.jar放到java目录bin目录下,比如

“C:\\Program Files\\JAVA\\java-1.8.0-openjdk-1.8.0.201\\bin\\tzupdater.jar”;

2、查看当前时区数据库版本,以windows为例,用管理员身份运行cmd,切换到tzupdater.jar对应的目录:

java -jar tzupdater.jar -V

3、在线更新,以windows为例,用管理员身份运行cmd,切换到tzupdater.jar对应的目录:(第3种和第4种更新方式任选一种)

java -jar tzupdater.jar -l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz

如图所示,已经更新成功到了tzdata2021a版本了。

更新后的文件是放在jre/lib/tzdb.dat ,如图所示,它有备份历史的版本。

4、离线更新:要先下载最新的时区数据,下载地址:

https://data.iana.org/time-zones/releases/

以windows为例,用管理员身份运行cmd。切换到tzupdater.jar对应的目录:

java -jar tzupdater.jar -l file:///[path]/tzdata.tar.gz 

注:

windows建议放在C盘根目录下,路径目录也不要有中文;

用管理员身份运行cmd(需要写权限);

如上面的命令所示,file后面的/是3个

5、以上执行完后,用第2步的查看当前时区数据库版本命令,查看是否更新成功。

服务自动化升级

思路步骤:

1、设置定时任务(操作系统配置就行),执行tzupdater 更新时区的命令脚本;

2、新开一个时区服务,用来对外提供时区和夏令时规则读取服务,独立部署;

3、在时区服务中,写个同步按钮,用来执行tzupdater 更新时区的命令脚本;

4、在时区服务中,将timeZone数据定时写到自定义的时区表中。提供维护功能,可以自定义新增修改删除timeZone数据。

此思路的好处:

1、其他服务不需要停止服务来更新时间,直接通过调用时区服务的数据,可保证获取到最新的时区数据;

2、自动化的好处,避免了手动维护时区的繁琐,人工介入有引发问题的风险;

3、时区服务和其他业务服务是拆分的,方便未来的扩展。

推荐相关文章

hutool日期时间系列文章

1DateUtil(时间工具类)-当前时间和当前时间戳

2DateUtil(时间工具类)-常用的时间类型Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)转换

3DateUtil(时间工具类)-获取日期的各种内容

4DateUtil(时间工具类)-格式化时间

5DateUtil(时间工具类)-解析被格式化的时间

6DateUtil(时间工具类)-时间偏移量获取

7DateUtil(时间工具类)-日期计算

8ChineseDate(农历日期工具类)

9LocalDateTimeUtil(JDK8+中的{@link LocalDateTime} 工具类封装)

10TemporalAccessorUtil{@link TemporalAccessor} 工具类封装

其他

要探索JDK的核心底层源码,那必须掌握native用法

万字博文教你搞懂java源码的日期和时间相关用法

java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案

源码分析:JDK获取默认时区的风险和最佳实践

高级JAVA开发必须掌握技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量),2万字详解)

高级JAVA开发必须掌握技能:java8 新日期时间API((二)JSR-310:常用的日期时间API),4万字详解)

参考:

TZUpdater :https://www.oracle.com/java/technologies/javase/tzupdater-readme.html

IANA时区数据版本:https://data.iana.org/time-zones/releases/

JRE 软件中的时区数据版本:https://www.oracle.com/java/technologies/tzdata-versions.html

以上是关于高级JAVA开发必备技能:时区的规则发生变化时,如何同步JDK的时区规则(实战方案,建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章

高级JAVA开发必备技能:java8 新日期时间API(JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)

高级JAVA开发必须掌握技能java8 新日期时间API(JSR-310:ZoneId 时区和偏移量),2万字详解(全程干货,建议收藏)

高级JAVA开发必备技能:java8 新日期时间API(JSR-310:实战+源码分析)(JAVA 小虚竹)

高级JAVA开发必备技能:java8 新日期时间API(JSR-310:常用计算工具)(JAVA 小虚竹)

高级JAVA开发必备技能:java8 新日期时间API(JSR-310:格式化和解析)(JAVA 小虚竹)

高级JAVA开发必备技能:java8 新日期时间API(JSR-310:常用的日期时间API)(JAVA 小虚竹)