簡體   English   中英

轉換為java.util.Date時,將一天2CE的LocalDateTime轉換一天

[英]Converting a LocalDateTime of the year 2CE out by one day when converting to java.util.Date

我有一個用字符串“ 0002-01-04T00:49:40.000”表示的日期,即2CE年。 我需要通過將其與時區ID“ Etc / UTC”結合起來,將其轉換為java.util.Date的實例。 以下代碼顯示了我的操作方法:

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”。

如我的評論所示,沒有錯誤。 一切都是正確的,盡管您沒有期望觀察到的結果。 因此,我將詳細解釋。 基於您的輔助方法的示例代碼:

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。 在此日期之前,將使用儒略歷。 而您使用年份0002! 因此,在此我們將Joda-Time的公歷日期部分與儒略歷日期進行比較 對於0002年,由於不同的leap年規則,兩個日歷之間存在兩天的差異。 朱利安日歷在0002年提前兩天 如何理解這兩天? 100、200、300、500、600、700、900、1000、1100、1300、1400和1500年在公歷中沒有leap年,而在儒略歷中的leap年=> 12天差。 但是教皇格里高里在1582年刪除了10天(在1582-10-04之后的第二天是1582-10-15)。 因此:公元100年之前和公元前99年之后的年份中,12-10 = 2天增量。

  • 總結 :[0002-01-04]減去一日(PST的時間校正)加上兩天(日歷的校正)將得到[0002-01-05]您所觀察到的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM