【发布时间】:2020-05-23 08:36:56
【问题描述】:
考虑以下代码:
ZoneId zoneId = ZoneId.of("America/Los_Angeles");
long currMillis = 2530778400000L;
Instant curr = Instant.ofEpochMilli(currMillis);
LocalDateTime dt = LocalDateTime.ofInstant(curr, zoneId); //the local one just for completeness
ZonedDateTime zdt = ZonedDateTime.ofInstant(curr, zoneId);
Calendar calendar = GregorianCalendar.from(zdt);
System.out.println(String.format("%-30s %s", "java-8 LocalDateTime hour:", dt.toLocalTime().getHour()));
System.out.println(String.format("%-30s %s", "java-8 ZonedDateTime hour:", zdt.toLocalTime().getHour()));
System.out.println(String.format("%-30s %s", "Calendar hour:", calendar.get(Calendar.HOUR_OF_DAY)));
印刷:
java-8 LocalDateTime hour: 3
java-8 ZonedDateTime hour: 3
Calendar hour: 2
似乎在这个小时左右日历从第 2 小时跳到第 4 小时(如果它对应于 DST 更改,通常不一定是问题)。
我正在使用 AdoptOpenJDK 1.8.0_242,但我也检查过 HotSpot 1.8.0_181 - 同样的问题。
为什么日历报告的时间与 ZonedDateTime 不同?
这种不匹配是一个已知问题吗?
我应该更信任谁——在这种情况下是 ZonedDateTime 还是 Calendar?
【问题讨论】:
标签: java datetime java-8 calendar zoneddatetime