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

标签 java datetime duration timezone-offset jsr310

我正在准备 Java OCP 测试,在模拟测试中有一个关于 Java DateTime 的问题是这样的:

Given that New York is 3 hours ahead of Los Angeles, what will the following code print?

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);

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

假设纽约比洛杉矶早 3 小时,这是否意味着,例如,纽约是 5:00,然后洛杉矶是 2:00。所以 Duration.between(5,2) 应该是 PT-3H,因为根据 Javadoc:如果结束早于开始,则此方法的结果可能是一个负周期。为保证在结果上调用 abs() 获得正持续时间。,在这种情况下,“2” 之前 “5” 所以结果应该是 PT-3H,而不是 PT3H。

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

最佳答案

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

关于java - Java DateTime 中的 Duration.between() 返回负值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44965556/

相关文章:

ruby-on-rails - Rails 单元测试中的日期时间问题

postgresql - spark 将字符串转换为 TimestampType

javascript - 使用 javascript 和表排序器动态获取时无法对日期列进行排序

java - 在java中查找MP3文件的长度,最好以毫秒为单位,就像python的mutagen库一样

ios - 如何在 Spotify 播放器中向前或向后 10 秒

java - principal.getName() 返回 facebook 的 ID 而不是名称

java.lang.ArrayIndexOutOfBoundsException 错误?

java - Hibernate 无法连接到 debian 上的纯 MySQL 安装

java - 使用 DropWizard 和 MongoDB 在多个值中搜索关键字