時區的規則發生變化時,如何同步時區
場景
服務器安裝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/lib或JRE_HOME /lib目錄。
如果未指定任何選項,則會顯示用法消息。要更新時區數據,請使用-l或-f選項。
-h, --help
手動升級
注意:
1、在安裝的 JDK/JRE 軟件上運行 TZUpdater 工具之前,您必須停止操作系統上的 JDK/JRE 軟件的任何正在運行的服務。
2、要成功更新時區數據,您應該確保您有足夠的權限來修改JDK_HOME /jre/lib或JRE_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獲取默認時區的風險和最佳實踐
參考:
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
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。