2017-01-23 65 views
2

我運行下面的代碼:SimpleDateFormat的解析字符串錯誤的時間

SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); 

    try{ 
     Date date = sdf.parse("03-28-2003 01:00:00"); 
     System.out.print(date.toString()); 
    } 
    catch(Exception e){ 
     //do something 
    } 

解析的結果是這樣的日期:2003-03-28T02:00:00.000 + 0300

一個小時添加。

當我將年/日/小時更改爲任何其他有效的號碼時,我會得到正確的時間,不會增加額外的小時。如果我只改變分鐘或秒數,我仍然可以獲得新增的小時數。

誰能告訴我爲什麼會發生這種情況?

編輯:

這與夏令時在我的程序運行時導通UTC + 02的時區適用於:00。 在這個時區,時鐘在2003-03-28更改。這就是爲什麼要增加一小時的原因,正如下面的評論和回答所建議的那樣。

我使用了答案中建議的代碼來解析我的日期和解析工作!日期正確解析,額外的小時不被添加。

+0

我得到這個輸出'Fri Mar 28 01:00:00 CET 2003'。這可能是一個CET!= CEST問題。 –

+0

試試這個sdf.setTimeZone(TimeZone.getTimeZone(「GMT」)); – Feek

+0

謝謝,我現在得到正確的時間,假設給定的日期是在當地時間..但在我的情況下,日期已在GMT時區給我,所以我不能使用它..我只需要將字符串解析爲日期對象。 – mormayr

回答

1

發現你的代碼確實做了很複雜的事實,不僅SimpleDateFormat.parse()可能取決於計算機的默認時區(並且在這種情況下,模式不包括時區),也取決於Date.toString()默認時區。不過,我知道你想用UTC來解釋日期字符串,所以我將專注於解析正確的解析,而不必太擔心打印的內容。

Feek公司是在註釋正確的SimpleDateFormat的時區設置爲UTC會得到你想要的東西,例如:

sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

這一行添加try之前,我在我的電腦上這個輸出:

Fri Mar 28 02:00:00 CET 2003 

2 am。 CET同意1 UTC,所以現在解析是正確的。

請允許我補充一點,如果你可以使用Java 8日期和時間裏,我發現了對應的代碼更爲清楚:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy HH:mm:ss"); 
    LocalDateTime dateTime = LocalDateTime.parse("03-28-2003 01:00:00", formatter); 
    OffsetDateTime utcDateTime = dateTime.atOffset(ZoneOffset.UTC); 
    System.out.println(utcDateTime); 

的關鍵不在於它的短,但你不很容易對它的功能產生懷疑,並且不容易出現時區或DST問題。另外一個好處是,產量也預期:

2003-03-28T01:00Z 

現在,顯而易見的是,時間是正確的(Z意味着Z或祖魯語或UTC時區,它有多個名稱)。

如果由於某種原因,你絕對需要一個老派java.util.Date對象,這並不難:

Date date = Date.from(utcDateTime.toInstant()); 

這讓我們從sdf.parse()與UTC時間得到了相同的日期。

相關問題