2012-05-14 57 views
3

我正在使用SimpleDateFormat和RFC 1123格式化日期並解析日期。但是,解析(格式(日期))有時與原始日期有一小時不同。SimpleDateFormat解析是一個小時(在夏季使用RFC 1123,GMT)

下面的代碼:

public static void main(String[] args) throws ParseException { 
    String RFC1123_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz"; 
    SimpleDateFormat dateFormat = new SimpleDateFormat(RFC1123_DATE_PATTERN); 

    Date date = new Date(1000); 
    String str = dateFormat.format(date); 
    Date date2 = dateFormat.parse(str); 

    System.out.println("date="+date+"; "+date.getTime()); 
    System.out.println("str="+str); 
    System.out.println("date2="+date2+"; "+date2.getTime()); 
} 

寫出:

date=Thu Jan 01 01:00:01 GMT 1970; 1000 
str=Thu, 01 Jan 1970 01:00:01 GMT 
date2=Thu Jan 01 02:00:01 GMT 1970; 3601000 

我從apache.http.util.DateUtil這種模式因此預計它[1]的工作。

大概這是GMT是否包含或不包括夏令時的混淆?

我正在使用Java™SE運行時環境(構建1.6.0_31-b04-415-10M3646,也在1.7.0_71上測試過)。


一種解決方法是使用圖案 「EEE,DD MMM YYYY HH:MM:SS Z」,其給出:

date=Thu Jan 01 01:00:01 GMT 1970; 1000 
str=Thu, 01 Jan 1970 01:00:01 +0100 
date2=Thu Jan 01 01:00:01 GMT 1970; 1000 

[1] http://www.docjar.com/html/api/org/apache/http/util/DateUtils.java.html

編輯:如每@ oscar-castiblanco的評論,我已將它更改爲new Date(1000),而不是使用1234ms。同樣的問題仍然存在。

+0

什麼'System.out.println(TimeZone.getDefault())'打印? – Roman

回答

1

我嘗試了第一圖案 「EEE,DD MMM YYYY HH:MM:SS ZZZ」,我得到了這個答案

date=Thu Jan 01 01:00:01 CET 1970; 1234 
str=Thu, 01 Jan 1970 01:00:01 CET 
date2=Thu Jan 01 01:00:01 CET 1970; 1000 

我嘗試第二種模式,我得到了同樣的答案。

爲了具有在這兩種情況下我改造的缺失毫秒添加到圖案的同時:

圖案= 「EEE,DD MMM YYYY HH:MM:SS:SSS Z」

date=Thu Jan 01 01:00:01 CET 1970; 1234 
str=Thu, 01 Jan 1970 01:00:01:234 +0100 
date2=Thu Jan 01 01:00:01 CET 1970; 1234 
+0

感謝您的回覆;事實上,我應該用了整整數秒。 所以看起來像CET和格林威治標準時間不同,以應對夏令時... –

0

GMT沒有夏令時。在英國,我們靠「英國標準時間」生活,這裏有夏令時間。 「格林威治標準時間」是世界參考時間,沒有夏令時。但是,微軟得到這個錯誤,這有助於混淆。

相關問題