2010-01-21 34 views
9

我有一個Java的實例似乎正在使用完全不正確的時區。它不使用Windows使用的澳大利亞/悉尼時區,而是使用美洲/加拉加斯時區。java不正確的時區

我先通過系統時鐘檢查了Windows時間,然後檢查了HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ControlSet001,ControlSet002。所有設置爲悉尼時區。

有人知道這是Java中的錯誤,還是指的是其他地方設置的時間?

Java版本是1.6.0_06

+0

在過去的日子裏,我看到JVM認爲OS/2中的「MET」時區不是中歐時區,而是中東時區。花了我一段時間,弄清楚爲什麼所有的日期都是3.5個小時。 –

回答

11

確保你啓動應用程序時設置時區爲JVM:

-Duser.timezone="Australia/Sydney" 
+0

希望有一個合適的解決方案,但最終會採用這種解決方法。 –

+0

如果我想設置爲UTC? –

+0

-Duser.timezone =「UTC」 –

2

嘗試在你的應用程序來手動獲取缺省的時區,或設置時區(註釋行)。我的

小例子:

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 
import java.util.TimeZone; 

public class Main { 
    public static void main(String[] args) { 
     Locale locale = Locale.getDefault(); 
     TimeZone localTimeZone = TimeZone.getDefault(); 
     //TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney"); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale); 
     dateFormat.setTimeZone(localTimeZone); 
     Date rightNow = new Date(); 
     System.out.println(locale.toString() + ": " + dateFormat.format(rightNow)); 
    } 
} 
+0

謝謝你們,我想知道不過_why_我應該手動指定時區。它不應該與操作系統一樣嗎? –

+0

順便說一句,上述代碼返回正確的語言環境,但不正確的時區。 –

+0

應該是。您可以嘗試將Java更新到最新版本,以防出現錯誤。 – balent

2

我最近遇到了同樣的問題,顯然這是由於Windows在註冊表中表示它的時區設置以及Java未能正確解釋它的時區設置造成的。

更多細節可以在this article發現,這也說明了受影響的機器「治癒」:

  • 手動更改日期/時間,然後變回原來的正確時間。
  • 改變時區,然後回到原來的。
  • 請求從時間服務器自動更新時間。
+0

升級到Windows Server 2008後,我們遇到了與Java 7相同的問題。更改系統的時區,然後恢復它,解決了我們的問題。 –

0

我有同樣的錯誤,當我設置我的時區以馬來半島標準時間,在JVM給我委內瑞拉時間時區。

下面的修復工作對我來說:

在註冊表編輯器,編輯您的時區到另一個時區(我試圖把像「新加坡時間」其他文本,您可以在這裏找到註冊表:

HKEY_LOCAL_MACHINE /系統/ CurrentControlSet /控制/ TimeZoneInformation

,然後我重新回使用控制面板,日期和時間設置。 當我回來檢查註冊表編輯器,我需要的時區,我可以看到它恢復馬來半島標準時間,我的JVM正確讀取它現在...

1

有這樣的問題的歷史來去,沒有合理的解決方案。查看更多在這裏:Java incorrect time zone bug on Windows

編輯:接聽湯姆和弗朗西斯:簡單地說,Java運行時有硬的時間做正確找出計算機上當前時區的工作。

時區上的Windows註冊表信息一直不可靠,對於依賴於msvcrt.dll和各種msvcrxx.dll的本地windows API也是如此。還有Managed(.NET)API,它需要安裝與.NET的可移植性相矛盾的.NET Framework的某個版本。因此,Java運行時的開發人員在Windows上的當前時區上很困難,這可能會持續下去,直到微軟有合理的理由。

如果您希望您的Java應用程序在任何時區都能正常工作,請爲用戶提供通過GUI更正時區的可能性。

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Tom