2013-02-20 100 views
2

我們有一個使用的-Duser.timezone參數在啓動一個Java PROGRAMM:Java的時區和夏令冬季

-Duser.timezone =「CET」

這是因爲neccessary我們不能依靠在服務器內部時鐘(管理員玩耍,設置錯誤時區等,不要:-(問),它是重要的是前端的時區的後端相匹配。

由於這個程序沒有定期重新啓動(這是一個服務器)我想知道當我們從冬季切換到夏季會發生什麼?它會自動切換還是我們必須重新啓動服務器?

感謝和問候, 亞歷

編輯:是java的決定與ervery調用正確的時區到使用日期的功能,這是可能的。但java也可能在啓動時確定一次正確的時區。

回答

2

Java中的時間僅僅是一個簡單的長值(自1970年以來毫秒)沒有關於時區的任何信息。 java.util.Datejava.sql.Date也將內部的日期/時間存儲爲自1970年以來的毫秒,但具有UTC時區。

時區進場時,當你格式化輸出,或當你從一個字符串分析日期/時間的日期/時間。您通過-Duser.timezone設置的時區信息將在當時使用。

所以它應該工作以及一個小的測試也顯示內容:

public static void main(String[] args) { 
    Calendar c = Calendar.getInstance(); 
    c.set(2013, 2, 30, 23, 0, 0); 
    long start = c.getTimeInMillis(); 
    long oneHour = 1000 * 60 * 60; 
    long t = start; 
    for (long i = 0; i < 5; i++) { 
     System.out.println(new Date(t));    
     t = t + oneHour; 
    } 
} 

使用-Duser.timezone=GMT它將打印:(無開關)

Sat Mar 30 23:00:00 GMT 2013 
Sun Mar 31 00:00:00 GMT 2013 
Sun Mar 31 01:00:00 GMT 2013 
Sun Mar 31 02:00:00 GMT 2013 
Sun Mar 31 03:00:00 GMT 2013 

使用-Duser.timezone=CET它將打印:(開關在凌晨2點)

Sat Mar 30 23:00:00 CET 2013 
Sun Mar 31 00:00:00 CET 2013 
Sun Mar 31 01:00:00 CET 2013 
Sun Mar 31 03:00:00 CEST 2013 
Sun Mar 31 04:00:00 CEST 2013 

使用-Duser.timezone=EET它將打印:(東歐洲時間,一小時後,CET)

Sat Mar 30 23:00:00 EET 2013 
Sun Mar 31 00:00:00 EET 2013 
Sun Mar 31 01:00:00 EET 2013 
Sun Mar 31 02:00:00 EET 2013 
Sun Mar 31 04:00:00 EEST 2013 
+0

非常感謝您的詳細解答和解決我的問題。 – AlexWerz 2013-02-20 14:07:29

0

我敢肯定設置user.timezone設置缺省的時區就像TimeZone.setDefault()。因此,它不會針對夏令時或其他更改進行更新。

如果你真的要做到這一點,我的建議是創建一個自定義的請求到服務器,可以通過調用TimeZone.setDefault()更改時區。這樣,您可以在需要時更改它,而無需重新啓動服務器。顯然,這個請求需要被保護,以便只有管理員才能執行它。