0

我有一个由字符串“0002-01-04T00:49:40.000”表示的日期,即公元 2 年的日期。我需要java.util.Date通过将其与时区 ID“Etc/UTC”相结合,将其转换为一个实例。以下代码显示了我是如何做到的:

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 月 5 日星期四 16:49:40 PST 2”。

4

1 回答 1

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。在此日期之前,使用儒略历。而你使用 0002 年!因此,在这里我们将 Joda-Time 的预测公历日期部分与儒略历日期进行比较。对于 0002 年,由于闰年规则不同,两个日历之间有两天的差异。儒略历在 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]。

于 2016-11-30T12:11:15.123 回答