转换为java.util.Date时,将一年中的LocalDateTime转换为一天

转换为java.util.Date时,将一年中的LocalDateTime转换为一天,java,datetime,jodatime,to-date,localdate,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

我在中有一个日期,由字符串“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)。因此,这个细节解释了为什么在我的例子中,时间比UTC提前一小时(在你的例子中,由于你的区域PST,时间比UTC晚8小时)。如果我们只考虑时间,那么我们预计GMT + 01的日期和PST……/P>
  • 的一天提前。
  • 鲜为人知但非常重要的是:
    java.util.Date.toString()
    的输出使用混合日历,公历转换设置为1582-10-15。在此日期之前,使用儒略历。你用的是0002年!因此,这里我们将约达时间的前公历日期部分与儒略历日期进行比较。对于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]你观察到的结果


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

      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)。因此,这个细节解释了为什么在我的例子中,时间比UTC提前一小时(在你的例子中,由于你的区域PST,时间比UTC晚8小时)。如果我们只考虑时间,那么我们预计GMT + 01的日期和PST……/P>
      • 的一天提前。
      • 鲜为人知但非常重要的是:
        java.util.Date.toString()
        的输出使用混合日历,公历转换设置为1582-10-15。在此日期之前,使用儒略历。你用的是0002年!因此,这里我们将约达时间的前公历日期部分与儒略历日期进行比较。对于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]你观察到的结果


      可能重复的
      toDate()
      is的方法。
      java.util.Date.toString()
      使用公元0002年的儒略历!因此,我看不到任何问题或失败。@DimaSan如果您发布的链接没有解决有关观察到的输出的OP的具体问题,请参阅我的答案。
      toDate()
      is的方法可能重复。
      java.util.Date.toString()
      使用儒略历0002年!因此,我认为没有问题或失败。@DimaSan您发布的链接没有解决有关观察到的输出的OP的具体问题,请参阅我的答案。