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

标签 java datetime jodatime to-date localdate

我有一个由字符串“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” --->“太平洋标准时间 1 月 5 日星期四 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 年,由于闰年规则不同,两个日历之间存在两天差异。 儒略历 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] 减去一天(太平洋标准时间的时间校正)加上两天(日历校正)会得到 [0002-01-05] 您观察到的结果.

关于java - 转换为 java.util.Date 时,将 2CE 年的 LocalDateTime 转换为一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875870/

相关文章:

java - 日期数据结构的 Joda 等价物

java - 如果进程以退出代码 0 结束,我应该调用 Process.destroy() 吗?

java - 具有多个模式的 WSDL 的自定义解析和打印方法

java - 关于字节数组异或运算的字符串长度

java - Camel : Ignore some messages in mock endpoint

mysql - 带连接的 SQL 中的时差

python - 将两个时间戳 float 转换为可读的年数、月数和天数

c# - 日期时间格式 yyyy-MM-ddT00 :00:00

java - Joda Time : parse string

java - 阴影 joda 时间不包含类