Почему знак минус присутствует в выводе?
У меня есть следующие строки кода:
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
).