当 Java DateTime 中的 Duration.between() 返回负值时

Ock*_*Ock 5 java datetime duration timezone-offset jsr310

我正在准备 Java OCP 测试,在模拟测试中有一个关于 Java DateTime 的问题,如下所示:

鉴于纽约比洛杉矶早 3 小时,以下代码将打印什么?

LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0);         
ZonedDateTime nyZdt = ldt.atZone(nyZone);
ZonedDateTime laZdt = ldt.atZone(laZone);
Duration d = Duration.between(nyZdt, laZdt);
System.out.println(d);
Run Code Online (Sandbox Code Playgroud)

正确答案是 PT3H 但我有点困惑,这本书是否给出了错误的答案?

鉴于纽约比洛杉矶早 3 小时,这是否意味着,例如,纽约是 5:00,然后洛杉矶将是 2:00。所以Duration.between(5,2)应PT3H因为根据的Javadoc: The result of this method can be a negative period if the end is before the start. To guarantee to obtain a positive duration call abs() on the result.,并且在这种情况下,“2” “5”所以结果应该是PT3H,不PT3H。

你怎么看,哪一个是正确的?

kew*_*wne 5

Duration.between返回两个时刻之间的差值。对于LocalDateTime,这意味着正确的答案需要标准化时区。由于洛杉矶当地时间较晚,因此结果为正。

纽约的凌晨 6:00,洛杉矶的凌晨 3:00,这意味着距离洛杉矶的凌晨 6:00 还需要 3 个小时。相反,洛杉矶的上午 6:00,纽约的上午 9:00,这意味着距离纽约上午 6:00 已经过去了 3 个小时。

LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0);         
ZonedDateTime nyZdt = ldt.atZone(nyZone); // 6:00 AM NY = 3:00 AM LA
ZonedDateTime laZdt = ldt.atZone(laZone); // 6:00 AM LA = 9:00 AM NY
Duration d = Duration.between(nyZdt, laZdt); // 9:00 AM NY - 6:00 AM NY = 3H   OR 3:00 AM LA - 6:00 AM LA = 3H
Run Code Online (Sandbox Code Playgroud)