XP 自動更新安裝時區補丁後,Java 程式取得的時間比系統時間少 8 小時(東八區應為 +8,卻變成 UTC)。
// 方法 1:系統屬性
System.setProperty("user.timezone", "Asia/Shanghai");
// 方法 2:強制設定預設時區
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
缺點:只對當前 JVM 生效,應用伺服器 (Tomcat, WebLogic 等) 記錄的日誌時間仍會錯誤,需逐一修改所有應用程式碼。
對比未更新機器,發現註冊機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 大小從 128KB 縮減為 72KB,關鍵時區定義遺失導致 Java JRE 讀取錯誤。
regedit → 匯出上述機碼為 TimeZones.reg此法一勞永逸,無需修改任何 Java 程式碼,所有 JVM 皆受益。