2013-09-24 67 views
1

當我在同一臺機器上編譯並運行以下代碼語句時,我得到兩個不同的時區值。每個JDK版本的時區值更改

public class TimeZoneDemo { 
    public static void main(String args[]){ 

    // create time zone object  
    TimeZone timezone = TimeZone.getDefault(); 

    // checking time zone value  
    System.out.println(timezone); 
    }  
} 

JDK 35年6月1日

Tue Sep 24 06:25:03 VET 2013 
sun.util.calendar.ZoneInfo[id="America/Caracas",offset=-16200000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null] 

JDK 02年7月1日

Tue Sep 24 22:56:54 MAGT 2013 
sun.util.calendar.ZoneInfo[id="Asia/Magadan",offset=43200000,dstSavings=0,useDaylight=false,transitions=66,lastRule=null] 

OS:窗口7 64位。

+0

你用什麼機器,用哪個操作系統? (Windows,Mac,Linux,...) – Joni

+0

您在機器上配置的實際位置是什麼? –

+0

Windows 7 64位。 –

回答

0

我也發現了類似的問題,java incorrect timezone 如我所料,有關於這個問題的錯誤,並已經與JDK

1

時區是針對JVM而不是JDK設置的。你用...

Duser.timezone="Europe/Sofia" 

設置此對JVM如果你把它傳遞給JVM你總是有相同的時區,當您更改版本。

神諭documentationTimeZone.getDefault()提到...

獲取此主機的默認時區。默認時區的來源可能會因實施而有所不同。

+1

我同意將'-Duser.timezone'設置爲JVM參數。但是JVM必須在沒有'-Duser.timezone'的情況下默認爲系統時區,不管實現/版本如何? – kotacc

1

當您查看下錶時,您將看到對JRE版本進行了哪些更新。

http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html

版本35年6月1日比版本02年1月7日更新。但是,這些環境中的一個環境仍然可能已經使用TZUpdater進行了更新。

既然只有您知道您的計算機位於何處,您才知道是否存在相關更改。

+0

我不這麼認爲,因爲我在新格式化的不同機器上測試過相同的代碼語句,所以它工作正常。 –

+0

@ mmc18:你是什麼意思,「我不這麼認爲」?我的回答沒有包含任何可能引起質疑的陳述。 – Holger

+0

當Day Light Time值或時間改變時,TZUpdater運行。我確信我感興趣的地點有任何變化。我認爲在JVM中有一個錯誤。 –

0

這些問題此起彼伏,當前版本也沒有合理的解決方案解決。在這裏看到更多:Java incorrect time zone bug on Windows

編輯:回答Andrew Arnold:簡而言之,Java運行時很難在計算機上正確查找當前時區。

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