現象:部署在 Windows Server 2008 / Vista / Windows 7 上的 Java 應用 (WebLogic, Tomcat, 自研系統) 系統時間比作業系統時間慢 8 小時 (或快 8 小時,視時區而定)。修改作業系統時區、註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 均無效。
1.5.0_07 (Sun JDK 5.0 Update 7,2006 年發布)。jre/lib/zi/) 與作業系統新版時區定義不兼容,導致 TimeZone.getDefault() 解析偏移量錯誤 (通常偏移 GMT+8 → GMT 或反向)。https://java.sun.com/javase/downloads/widget/jdk6.jsp (歸檔) 或採用 OpenJDK 8/11/17 LTS (長期支援、免費商用)。JAVA_HOME 目錄。JAVA_HOME、PATH。java.exe。System.out.println(new Date()) 與 OS 時間一致。僅適用 Sun JDK 1.4.2 / 1.5.0 / JRockit 8.1/9.0 且無法升級的舊系統:
jre\lib\zi\Etc\jre\lib\zi\GMT 檔案。GMT-8 (或對應目標時區檔,如 GMT+8, Asia/Shanghai) 覆蓋 GMT。bea\jdk142_11\jre\lib\zi\Etc, bea\jdk142_11\jre\lib\zi, bea\jrockit81sp6_142_10\jre\lib\zi\Etc, bea\jrockit81sp6_142_10\jre\lib\zi。⚠ 風險:手動替換僅修正「預設時區」偏移,不修復夏令時切換、歷史時區變更、IANA 時區資料庫更新。長期運行將再次偏移。唯一正解是升級 JDK。
// JVM 啟動參數 (最高優先級)
-Duser.timezone=Asia/Shanghai
// 或程式碼啟動早期
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
可繞過 JDK 時區解析 Bug,但不解決底層時區資料庫缺失,僅作緩兵之計。
java -version,列出 JDK 5 / 6 早期版本 實例。結論:JDK 5 EOL 13 年,仍在生產環境運行屬重大安全與合規風險。請納入技術債清償計畫,統一升級至 OpenJDK 11/17 LTS,徹底解決時區、安全漏洞 (CVE)、效能、GC 調優等歷史包袱。