2010-03-10 67 views
5

我的時區是CET(柏林)。
雖然測試Joda的日期時間,我注意到一些奇怪的事情:奇達日期時間01.04.1893

new DateTime(1893, 4, 1, 0, 0, 0, 0); 
=> java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate(); 
=> Fri Mar 31 00:06:32 CET 1893 

A 6分32秒,導致一個不存在的時間的時區位移Δλ
我必須說這是非常意外的,因爲我沒有指定任何時區信息,因此並不期望遇到這種問題。
如果在1893年3月CET(柏林)不存在 - 爲什麼new DateTime(1893, 3, 31, 0, 0, 0, 0)選擇與我指定的時間(即0分鐘和0秒)相匹配的時區?

我可以通過DateTime獲得正確的時間嗎?

- 編輯 -
這個問題似乎是toDate()。在發佈問題之前,我編輯了它。
喬達本身其實正常工作:

new DateTime(1893, 3, 31, 0, 0, 0, 0); 
=> 1893-01-01T00:00:00.000+00:53:28 

這只是轉化爲日期移動偏移量分鐘和秒的一部分。

回答

10

如果您不指定時區,不幸的是喬達時間使用系統之一。是的,當時柏林really did change(以及6分32秒)。所以你指定了一個不存在的本地時間。

你是什麼意思「爲什麼不選擇與我指定的時間相匹配的時區?」 - 時區影響本地時間如何映射到UTC。在時區含蓄地指定(通過讓它選擇你的系統默認值)那段時間不存在;沒有UTC即時地圖到當地時間。 當地時間有多少個時區--Joda會如何選擇哪一個?

我同意在喬達的部分使用系統默認時區是一個壞的舉動(我們在Noda Time中修復了一個),但其餘的行爲都是絕對正確的。 (野田時間對這種情況恰好一個特定的異常,從傳遞這是更明顯的壞值區分開來,但我們去。)

如果你不想時區在所有進入它那麼你應該使用LocalDateTime來代替。

+5

IOW:這不是一個錯誤,它是一個功能。從字面上看。 – 2010-03-10 21:16:24

+0

感謝您的鏈接。我看到CET在那之前不存在。 我看到喬達實際上確實創建了日期。我的問題似乎與轉換爲java.util.Date不能很好地轉換(請參閱我的編輯)。但是這可能是Date比DateTime更多的問題。 – Stroboskop 2010-03-11 16:36:30

0

您是否嘗試過使用new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC);實例化該項目?

+0

我仍然想保留我的時區信息。 – Stroboskop 2010-03-11 16:17:53