2016-11-29 41 views
0

我有一個由字符串「0002-01-04T00:49:40.000」表示的日期,即年份爲2CE的日期。我需要將它與時區標識「Etc/UTC」結合,將其轉換爲java.util.Date的實例。以下代碼顯示我如何操作:當轉換爲java.util.Date時,將一年的2CE的LocalDateTime轉換爲一天

public static Date toDate(LocalDateTime localDateTime, String timezoneId){ 
    if(localDateTime == null) return null; 
    if(timezoneId != null) { 
     localDateTime.toDateTime(DateTimeZone.forID(timezoneId)).toDate(); 
    } else { 
     return localDateTime.toDateTime().toDate() 
    } 
} 

但是LocalDateTime.toDate()無法正常工作。它迄今爲止增加了+1天。

「0002-01-04T00:49:40.000Z」--->「Thu Jan 05 16:49:40 PST 2」。

+4

可能重複[如何使用GWT將日期時間字符串轉換爲日期?](http://stackoverflow.com/questions/11342670/how-to-convert-string-of-datetime-to-date -using-gwt) – DimaSan

+0

'toDate()'是[JodaTime](http://www.joda.org/joda-time/)的方法。 – DimaSan

+0

'java.util.Date.toString()'在0002年使用Julian日曆!所以我沒有看到問題或失敗。 –

回答

3

正如我的評論所示,沒有錯誤。儘管你沒有想到你觀察到的結果,但所有的都是正確的。因此我會詳細解釋它。基於您的幫手方法的示例代碼:

System.out.println(
    toDate(org.joda.time.LocalDateTime.parse("0002-01-04T00:49:40.000"), "GMT") 
); // Fri Jan 06 01:49:40 CET 2 

輸出基於方法java.util.Date.toString()。關於這種方法的令人困惑的事情是:

  • 它使用系統時區(在我的情況GMT + 01:00)。因此,這個細節解釋了爲什麼 - 在我的情況下 - 時間是提前一個小時(並且由於您的區域PST,在您的情況下,在UTC後面8個小時)。如果我們只考慮時間,那麼我們所期望的日期同一天GMT + 01,早一天爲PST ...

  • 很少有人知道,但很重要:的java.util.Date.toString()輸出採用的是混合日曆格里高利的割價設置爲1582-10-15。在此日期之前,使用Julian日曆。你用0002年!所以在這裏我們比較了Joda-Time的Juliet日期日期的預測格利高日期部分。在0002年,由於閏年規則不同,兩個日曆之間會有兩天的差異。 Julian日曆在0002年前兩天。如何理解這兩天? 100,200,300,500,600,700,900,1000,1100,1300,1400和1500年在公曆中不是閏年,而在儒略曆中的閏年=> 12天的差異。但教皇格雷戈爾於1582年刪除了10天(1582-10-04之後的第二天是1582-10-15)。因此:12 - 10 =公元前100年和公元前99年之後的2天三角洲。

  • 總結:[0002-01-04]減去一天(PST的時間校正)加上兩天(日曆校正)會導致您觀察到的情況[0002-01-05]。

相關問題