【发布时间】:2018-09-18 19:47:24
【问题描述】:
我有使用 java.util.Date 创建古代日期(0002 年 11 月 30 日)的旧代码。我正在尝试更新我可以更新的代码,但这需要在 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
因此,如果我在 21 月 30 日创建即时消息,然后转换为日期,则日期为 2 月 1 日。如果我从 11 月 30 日的日期开始,即时消息为 21 月 28 日。我知道Date 和 Instant 都不存储时区信息,但为什么根据我是从 Date 还是 Instant 开始,时代如此不同?无论如何我可以解决这个问题吗?我需要能够从 Date 或 Instant 开始,并以相同的 epoch 值结束。也很高兴知道为什么默认 toString() 在相同的纪元下显示如此不同的日期。
【问题讨论】:
-
你有一个舍入错误。不要使用
instant.getEpochSecond()*1000,使用instant.toEpochMilli()。 -
这两个框架并没有 100% 同意关于闰年的细节,因为它可以追溯到这么久远的历史。所以你需要明确你的要求。如果你有一个
Date在纪元前的一定天数,你是否需要一个Instant在纪元前的相同天数?或者,如果您的日期是 11 月 2 日,您是否需要 11 月 2 日的Instant?不一样,抱歉。 -
@teppic,谢谢,我没有注意到那里的方法。出于问题的目的,我认为毫秒值并不重要,尽管我可以看到这使示例变得混乱。
-
@OleV.V.我正在处理的代码是使用一个神奇的日期(让这对你来说是一个教训,孩子们),所以我想有一个即时日期和 11 月 2 日相同的日期,尽管我想我可以做任何一个这些选项中的一个。诀窍是有时我从 Instant 开始,有时我从 Date 开始。根据您的评论,我认为闰年让我感到悲伤......