【问题标题】:Converting a LocalDateTime of the year 2CE out by one day when converting to java.util.Date转换为 java.util.Date 时将 2CE 年的 LocalDateTime 转换为一天
【发布时间】:2017-04-14 00:55:45
【问题描述】:

我有一个由字符串“0002-01-04T00:49:40.000”表示的日期,即公元 2 年的日期。我需要通过将其与时区 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”--->“太平洋标准时间 2 月 05 日星期四 16:49:40”。

【问题讨论】:

  • toDate()JodaTime 的方法。
  • java.util.Date.toString() 使用 0002 年的儒略历!所以我认为没有问题或失败。
  • @DimaSan 您发布的链接没有解决 OP 关于观察到的输出的具体问题,请参阅我的回答。

标签: java datetime jodatime to-date localdate


【解决方案1】:

正如我的评论中所指出的,没有错误。一切都是正确的,尽管您没有预料到您观察到的结果。因此,我将详细解释它。基于您的辅助方法的示例代码:

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] 你观察到的结果.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2016-04-10
    • 2014-02-10
    • 2011-08-29
    • 2019-08-03
    • 2019-07-22
    相关资源
    最近更新 更多