我有一个用字符串“ 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]您所观察到的结果。

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

10-08 20:46