2011-05-31 59 views
3

我只是在Java的Date類的一個非常奇怪的行爲,就當我嘗試創建因此兩個日期:尷尬的Java日期創作行爲

Date startDate = new Date(1282863600000L); 
System.out.println(startDate); 

Date endDate = new Date(1321919999000L); 
System.out.println(endDate); 

輸出分別是:

 
Fri Aug 27 00:00:00 BST 2010 
Mon Nov 21 23:59:59 GMT 2011 

有沒有人看過類似的東西?這兩個日期都以相同的方式初始化,但打印時第一個以BST顯示,後一個以GMT顯示?

我試圖找到解釋,但我沒有。有人能幫我嗎?

在此先感謝!

+0

你還記得,由於夏令時時鐘繞向前/向後一小時? ;) – 2011-05-31 12:17:34

回答

1

對我來說,這段代碼的輸出是

Fri Aug 27 01:00:00 CEST 2010 
Tue Nov 22 00:59:59 CET 2011 

確切的結果取決於Java正在您的系統上使用默認語言環境。不同的是CEST is the central european summer time,而CET is the central european time(即不是夏令時)。

您似乎在英國語言環境中運行(en_GB或類似),因此您的輸出分別顯示British Summer TimeGreenwich Mean Time

您指定的第一個日期屬於相應的夏令時間,而第二個日期不屬於相應的夏令時。所以Java爲每個地區/時間組合選擇適當的時區。

5

這是記錄的行爲。

Date.toString()

此日期對象轉換爲以下形式的字符串:

dow mon dd hh:mm:ss zzz yyyy 

zzz是時區(並可以反映夏令時)。標準時區縮寫包括方法解析所識別的縮寫。如果時區信息不可用,則zzz爲空 - 即,它根本不包含任何字符。

您正在使用使用英國夏令時並創建應用日光節約規則的日期的區域設置。這將是當時對當地用戶的預期形式。

1

後嘗試不同long值一個可愛的會議上,我得到這個:

Date startDate1 = new Date(1284245999999L); 
Date startDate2 = new Date(1284246000000L); 
System.out.println(startDate1); 
System.out.println(startDate2); 

Date endDate = new Date(1321919999000L); 
System.out.println(endDate); 

產量爲:

Sun Sep 12 01:59:59 IDT 2010 
Sun Sep 12 01:00:00 IST 2010 <-- Long value is greater, but due to DST changes, actual time is one hour earlier 
Tue Nov 22 01:59:59 IST 2011 

注意遞增長,11284245999999L1284246000000L把我們「背及時「,因爲從標準時間過渡到夏令時。
這就是Java的時間計算的行爲 - 因爲1/1/1970毫秒數沒有變化,但它代表的時間是根據時區。

+0

謝謝你們!確實很有幫助的答案! – shadrik 2011-05-31 14:27:29