当前位置: 首页 > 知识库问答 >
问题:

在java.util.Date和java.time.instant之间转换古代日期时的差异

阎佑运
2023-03-14

我有使用java.util.date创建古老日期(30 nov0002)的遗留代码。我试图更新我能更新的代码,但这需要在Date和LocalDate之间转换,等等。我不能完全摆脱Date的使用或古老的日期选择。

我发现在这个古老的日期之间来回转换Date和Instant时出现了一个错误,希望有人能解释一下是怎么回事。

    Date date = new Date();
    Instant instant = date.toInstant();
    System.out.println("Current:");
    System.out.println("Date: "+date);
    System.out.println("Instant: "+instant);
    System.out.println("Date epoch:    "+date.getTime());
    System.out.println("Instant epoch: "+instant.getEpochSecond()*1000);

    System.out.println("\nAncient from Date:");
    Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("MST"));
    cal.set(2, Calendar.NOVEMBER, 30, 0, 0, 0);
    date = cal.getTime();
    instant = date.toInstant();
    System.out.println("Date: "+date);
    System.out.println("Instant: "+instant);
    System.out.println("Date epoch:    "+date.getTime());
    System.out.println("Instant epoch: "+instant.getEpochSecond()*1000);

    System.out.println("\nAncient from Instant:");
    instant = Instant.parse("0002-11-30T00:00:00Z");
    date = Date.from(instant);
    System.out.println("Date: "+date);
    System.out.println("Instant: "+instant);
    System.out.println("Date epoch:    "+date.getTime());
    System.out.println("Instant epoch: "+instant.getEpochSecond()*1000);

它打印以下内容:

Current:
Date: Tue Sep 18 12:34:27 MST 2018
Instant: 2018-09-18T19:34:27.177Z
Date epoch:    1537299267177
Instant epoch: 1537299267000

Ancient from Date:
Date: Thu Nov 30 00:00:00 MST 2
Instant: 0002-11-28T07:00:00.247Z
Date epoch:    -62075437199753
Instant epoch: -62075437200000

Ancient from Instant:
Date: Fri Dec 01 17:00:00 MST 2
Instant: 0002-11-30T00:00:00Z
Date epoch:    -62075289600000
Instant epoch: -62075289600000

所以如果我在11月30日创建一个瞬间,然后转换成一个日期,这个日期是12月1日。如果我从11月2日30日开始约会,那么这个瞬间就是11月2日28日。我知道日期和即时都不存储时区信息,但为什么基于我是从日期开始还是从即时开始,时间是如此不同?我能解决这个问题吗?我需要能够从一个日期或一个瞬间开始,并以相同的时代价值结束。如果知道为什么默认的toString()在相同的时间点上显示不同的日期也会很好。

共有1个答案

浦墨竹
2023-03-14

差异在于DateInstant的实现如何与它们的实现交互,Date使用公历/朱利安日历,Instant使用ISO标准的日期,后者在朱利安日历切换之前遵循修改后的公历。

GregorianCalendar实现有一个特别的注意事项:

在Gregorian cutover之前,GregorianCalendar实现儒略历。公历和儒略历的唯一区别是闰年规则。儒略历每四年规定闰年,而公历省略了不能被400整除的百年。

cal.set(1582, Calendar.OCTOBER, 4, 0, 0, 0);
cal.set(1582, Calendar.OCTOBER, 5, 0, 0, 0);

来自维基百科1582年

当我们研究1582年10月4日时,会发生以下情况:

日期:1582-Oct-04 00:00:00

如果要显示历史事件日期,最好使用dateJulianCalendarDateFormatter来显示正确的历史日期,就像它在历史中实际发生一样。打印出历史时期的ISO时间可能会显得荒谬或不准确,但以这种格式存储时间仍然有效。

 类似资料:
  • 问题内容: 我有使用java.util.Date创建旧日期(0002年11月30日)的旧代码。我正在尝试更新可以执行的代码,但这需要在Date和LocalDate之间进行转换,等等。我无法完全摆脱使用Date或古老的日期选择的麻烦。 我发现用这个古老的日期在Date和Instant之间来回转换时似乎出现了错误,并希望有人可以解释发生了什么。 这是一个示例: 打印以下内容: 因此,如果我在11月2日

  • 问题内容: Java 8具有用于日期和时间的全新API。此API中最有用的类之一是,用于保存与时区无关的date-with-time值。 为此目的,可能有数百万行代码使用遗留类。这样,在连接旧代码和新代码时,将需要在两者之间进行转换。由于似乎没有直接的方法可以完成此任务,该怎么办呢? 问题答案: 简短答案: 说明:(基于这个问题有关LocalDate) 尽管有名称,它代表时间轴上的一个瞬间,而不是

  • 问题内容: 我正在寻找在两个方向上在java.util.Date和javax.xml.datatype.XMLGregorianCalendar之间进行转换的简单方法。 这是我现在正在使用的代码 : 有没有更简单的事情,例如我忽略的一些API调用? 在标准XML日期/时间和Java日期对象之间进行转换似乎是一项非常常规的任务,令我感到惊讶的是,我完全必须编写这段代码。 有什么建议? 注意: 我的J

  • 问题内容: 我已经尝试过一百万种不同的方法,但是没有用。任何帮助将非常感激。 上面的方法不起作用。 基本上,我想做的是获取纪元时间并将其转换为澳大利亚时间。我的当地时间是+05.30,但是我当然不希望这成为促成这种转化的因素。 编辑- 当我运行您的确切代码时,输​​出 时代1318388699000 2011年10月12日星期三08:34:59 GMT + 05:30 12/10/2011 03:

  • 问题内容: Excel的日期时间值看起来像42291.60493,这意味着MySQL将其视为字符串而不是日期。是否存在可以将其转换为MySQL日期时间的MySQL代码?(即像在MS SQL中一样 ) 问题答案: 我可以想到2个解决方案: 使用excel中的text()函数将excel中的日期转换为符合mysql的日期和时间格式的格式化日期字符串。 在mysql中使用计算将数字转换为日期: (下面的

  • 我不想使用 库,因为我正在处理的项目需要文书工作来引入依赖项。如果我能在没有第三方库的情况下实现这一目标,我会更高兴。 我很难在CET和UTC之间转换日期,因为日期是夏时制。这与我预期的相差一个小时: CET比UTC提前一小时,夏季提前2小时。因此,我预计中欧在盛夏的10点30分将达到协调世界时的8点30分。 功能是: 我使用两个时区信息对象: