转换为java.util.Date时,将年份2CE的LocalDateTime转换为一天

时间:2016-11-29 21:15:03

标签: java datetime jodatime to-date localdate

我的日期用字符串“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”---> “星期四1月05日16:49:40太平洋标准时间2”。

1 个答案:

答案 0 :(得分: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的预感格里高利日期部分与儒略历日期进行比较。对于0002年,由于不同的闰年规则,两个日历之间存在两天的差异。 Julian日历在0002年前两天。这两天怎么理解?在公历中,100年,200年,300年,500年,600年,700年,900年,1000年,1100年,1300年,1400年和1500年都没有闰年,而朱利安历中的闰年=> 12天的差异。但是教皇格雷戈尔在1582年删掉了10天(1582-10-04之后的第二天是1582-10-15)。因此:在公元100年之前和公元前99年之后的年份,12-10 = 2天三角洲。

  • 总结:[0002-01-04]减去一天(PST的时间校正)加上两天(日历校正)会导致[0002-01-05]您观察到的内容