2014-12-04 66 views
3

我在America/Los_Angeles TZ,當我嘗試呈現午夜在America/Mazatlan TZ,我得到以下異常:無法解析的日期在美國/馬薩特蘭時區

Exception in thread "main" java.text.ParseException: Unparseable date: "12:00 AM" 

這裏是我的代碼重現此:

DateFormat dateFormat = new SimpleDateFormat("h:mm a"); 
    TimeZone timeZone = TimeZone.getTimeZone("America/Mazatlan"); 
    dateFormat.setTimeZone(timeZone); 
    dateFormat.setLenient(false); 
    Date parse = dateFormat.parse("12:00 AM"); 

我知道了註釋掉setLenient(false)將解決這個問題,我只是不知道爲什麼,這是一個固定在同一時區的其他偏移,如America/Inuvik不會引起這樣的問題。

任何協助將是偉大的。

+0

發現了其他幾個TZ發生了這種情況: 'America/Hermosillo','Mexico/BajaSur','America/Bahia_Banderas' – Nicholas 2014-12-04 21:53:54

回答

3

如果不指定日期,使用1970-01-01。

time zone definition for Mazatlan表明1970年的基準偏移從-08:00切換到-07:00。這在當地時間產生不連續性,類似於在spring-forward daylight saving time transition期間通常發現的類型。

從午夜到1點之前,有一小時的時間缺少當地時間。在這個範圍內的時間是無效的。假設該區域定義是正確的,這意味着前打勾這樣的鐘表:

======== UTC =======  ==== America/Mazatlan === 
1970-01-01T07:59:57Z  1969-12-31T23:59:57-08:00 
1970-01-01T07:59:58Z  1969-12-31T23:59:58-08:00 
1970-01-01T07:59:59Z  1969-12-31T23:59:59-08:00 
1970-01-01T08:00:00Z  1970-01-01T01:00:00-07:00 (transition!) 
1970-01-01T08:00:01Z  1970-01-01T01:00:01-07:00 
1970-01-01T08:00:02Z  1970-01-01T01:00:02-07:00 

因此,如果您正在使用SimpleDateFormat - 你應該包括日期,不只是一個時間。

+0

哇。謝謝你告訴我這件事,看起來很奇怪。這很有道理,因爲測試12:15 AM也失敗了。 – Nicholas 2014-12-04 22:05:21

1

如果刪除線,

dateFormat.setLenient(false); 

你解析對象的值越來越

 Thu Jan 01 10:00:00 EET 1970 

我不知道爲什麼,但對於America/Mazatlan TZ此行是創建例外。

對於America/Los_Angeles TZAmerica/Inuvik TZ,使用dateFormat.setLenient(false)行沒有給出任何錯誤,結果與America/Mazatlan TZ相同。

Thu Jan 01 10:00:00 EET 1970 
+0

謝謝。我編輯了我的問題,指出我知道寬鬆會導致問題,我希望有一個理由將其設置爲false會導致問題。 – Nicholas 2014-12-04 20:12:08

-1

那是因爲你dateFormat.setLenient(false); 12:00應該是 'PM' 而不是 'AM'

+0

它爲什麼會在這個時區有所作爲?其他人沒有問題,只是'美國/馬薩特蘭' – Nicholas 2014-12-04 21:10:52

+0

@Nicholas,我不知道通過閱讀源代碼瞭解這一點 – 2014-12-04 21:19:20

+0

感謝您的幫助。我試圖理解爲什麼它在這個時區出現如此奇怪的表現時,我看不到任何不尋常的東西。 – Nicholas 2014-12-04 21:21:34