Почему знак минус присутствует в выводе?

У меня есть следующие строки кода:

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 ответ

Решение

Это может стать более понятным, если вы напечатаете даты и соответствующий 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 [Америка / New_York]
2017-06-02T11: 00: 00Z
2017-06-02T10: 00: 00Z

Заметить, что nyOdt использует смещение -05:00 (5 часов после UTC), но nyZdt использует -04:00 (4 часа после UTC из-за перехода на летнее время в Нью-Йорке).

Преобразование их в Instantх, вы можете видеть, что nyOdt эквивалентно 11 утра в UTC, и nyZdt эквивалентно 10 утра в UTC. Вот почему разница между ними составляет минус один час: Duration.between() возвращает отрицательную длительность, если первый параметр находится после второгоnyOdt.toInstant().isAfter(nyZdt.toInstant()) возвращается true).

Другие вопросы по тегам