我有一個Java的實例似乎正在使用完全不正確的時區。它不使用Windows使用的澳大利亞/悉尼時區,而是使用美洲/加拉加斯時區。java不正確的時區
我先通過系統時鐘檢查了Windows時間,然後檢查了HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/
和ControlSet001
,ControlSet002
。所有設置爲悉尼時區。
有人知道這是Java中的錯誤,還是指的是其他地方設置的時間?
Java版本是1.6.0_06
我有一個Java的實例似乎正在使用完全不正確的時區。它不使用Windows使用的澳大利亞/悉尼時區,而是使用美洲/加拉加斯時區。java不正確的時區
我先通過系統時鐘檢查了Windows時間,然後檢查了HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/
和ControlSet001
,ControlSet002
。所有設置爲悉尼時區。
有人知道這是Java中的錯誤,還是指的是其他地方設置的時間?
Java版本是1.6.0_06
確保你啓動應用程序時設置時區爲JVM:
-Duser.timezone="Australia/Sydney"
希望有一個合適的解決方案,但最終會採用這種解決方法。 –
如果我想設置爲UTC? –
-Duser.timezone =「UTC」 –
嘗試在你的應用程序來手動獲取缺省的時區,或設置時區(註釋行)。我的
小例子:
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));
}
}
謝謝你們,我想知道不過_why_我應該手動指定時區。它不應該與操作系統一樣嗎? –
順便說一句,上述代碼返回正確的語言環境,但不正確的時區。 –
應該是。您可以嘗試將Java更新到最新版本,以防出現錯誤。 – balent
入住信息: http://techtavern.wordpress.com/2010/04/15/java-and-incorrect-timezone-on-windows-xp/
這表明,有在JVM中的錯誤,導致從Windows註冊表讀取不正確的默認時區。目前還沒有錯誤修復。
我最近遇到了同樣的問題,顯然這是由於Windows在註冊表中表示它的時區設置以及Java未能正確解釋它的時區設置造成的。
更多細節可以在this article發現,這也說明了受影響的機器「治癒」:
- 手動更改日期/時間,然後變回原來的正確時間。
- 改變時區,然後回到原來的。
- 請求從時間服務器自動更新時間。
升級到Windows Server 2008後,我們遇到了與Java 7相同的問題。更改系統的時區,然後恢復它,解決了我們的問題。 –
我有同樣的錯誤,當我設置我的時區以馬來半島標準時間,在JVM給我委內瑞拉時間時區。
下面的修復工作對我來說:
在註冊表編輯器,編輯您的時區到另一個時區(我試圖把像「新加坡時間」其他文本,您可以在這裏找到註冊表:
HKEY_LOCAL_MACHINE /系統/ CurrentControlSet /控制/ TimeZoneInformation
,然後我重新回使用控制面板,日期和時間設置。 當我回來檢查註冊表編輯器,我需要的時區,我可以看到它恢復馬來半島標準時間,我的JVM正確讀取它現在...
有這樣的問題的歷史來去,沒有合理的解決方案。查看更多在這裏: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更正時區的可能性。
儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Tom
在過去的日子裏,我看到JVM認爲OS/2中的「MET」時區不是中歐時區,而是中東時區。花了我一段時間,弄清楚爲什麼所有的日期都是3.5個小時。 –