为什么输出中会出现减号?

时间:2017-09-18 19:40:06

标签: datetime java-8 duration java-time timezone-offset

我有以下几行代码:

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之前。我错了吗?

1 个答案:

答案 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