我有以下几行代码:
LocalDateTime ldt = LocalDateTime.of(2017, 06, 02, 6, 0, 0);
ZoneOffset nyOffset = ZoneOffset.ofHoursMinutes(-5, 0);
ZoneId nyZone = ZoneId.of("America/New_York");
OffsetDateTime nyOdt = ldt.atOffset(nyOffset);
ZonedDateTime nyZdt = ldt.atZone(nyZone);
Duration d = Duration.between(nyOdt, nyZdt);
System.out.println(d);
输出为PT-1H
。为什么会这样? nyZdt
不在nyOdt
之前。我错了吗?
答案 0 :(得分:3)
如果您打印两者的日期和相应的UTC Instant
,这可以变得更加清晰:
System.out.println(nyOdt);
System.out.println(nyZdt);
System.out.println(nyOdt.toInstant());
System.out.println(nyZdt.toInstant());
这将打印:
2017-06-02T06:00-05:00
2017-06-02T06:00-04:00 [美国/纽约]
2017-06-02T11:00:00Z
2017-06-02T10:00:00Z
请注意nyOdt
正在使用偏移-05:00
(比UTC晚5个小时),但nyZdt
正在使用-04:00
(比{{3} {4}落后于UTC })。
将它们转换为Instant
,您可以看到nyOdt
相当于UTC的上午11点,而nyZdt
相当于UTC的上午10点。这就是为什么两者之间的差异为减去一小时:Duration.between()
会返回否定的持续时间Daylight Saving Time in New York(而nyOdt.toInstant().isAfter(nyZdt.toInstant())
会返回true
)