Проблема в том, как вы конвертируете входные данные в ZonedDateTime
значения
ZonedDateTime zdtSummer = odtSummer.toLocalDateTime().atZone(zoneId);
ZonedDateTime zdtWinter = odtWinter.toLocalDateTime().atZone(zoneId);
Здесь вы говорите: "возьмите версию OffsetDateTime
с локальной датой и временем и притворитесь, что это былона самом деле локальное значение в данном часовом поясе ". Таким образом, вы получите «10:00 по местному времени в часовом поясе», а не «10:00 UTC, преобразованные в местный часовой пояс».
Вы писали, что «На данный момент время летнего времени корректно настроено» -но это не так. Вы начали со значения «2019-09-11T10: 00: 00.000 + 0000», но при печати Instant
печатается «2019-09-11T09: 00: 00Z». 10:00 UTC и 9:00 UTC - это не одно и то же мгновение.
Вместо этого вы должны преобразовать OffsetDateTime
в Instant
- это то, что вы действительно проанализировали - и затем положить , что в соответствующем часовом поясе:
ZonedDateTime zdtSummer = odtSummer.toInstant().atZone(zoneId);
ZonedDateTime zdtWinter = odtWinter.toInstant().atZone(zoneId);
Или используйте OffsetDateTime.atZoneSameInstant
ZonedDateTime zdtSummer = odtSummer.atZoneSameInstant(zoneId);
ZonedDateTime zdtWinter = odtSummer.atZoneSameInstant(zoneId);
Обратите внимание, что тогда нет смысла переходить от этого назад кмгновенно, чтобы получить LocalDateTime
- просто используйте toLocalDateTime
. Если вам нужны все соответствующие типы, вот соответствующий код:
OffsetDateTime odtSummer = OffsetDateTime.parse(summerTime, OFFSET_FORMAT);
OffsetDateTime odtWinter = OffsetDateTime.parse(winterTime, OFFSET_FORMAT);
Instant instSummer = odtSummer.toInstant();
Instant instWinter = odtWinter.toInstant();
ZonedDateTime zdtSummer = instSummer.atZone(zoneId);
ZonedDateTime zdtWinter = instWinter.atZone(zoneId);
LocalDateTime ldtSummer = zdtSummer.toLocalDateTime();
LocalDateTime ldtWinter = zdtWinter.toLocalDateTime();
Если вам не нужен Instant
, просто:
OffsetDateTime odtSummer = OffsetDateTime.parse(summerTime, OFFSET_FORMAT);
OffsetDateTime odtWinter = OffsetDateTime.parse(winterTime, OFFSET_FORMAT);
ZonedDateTime zdtSummer = odtSummer.atZoneSameInstant(zoneId);
ZonedDateTime zdtWinter = odtWinter.atZoneSameInstant(zoneId);
LocalDateTime ldtSummer = zdtSummer.toLocalDateTime();
LocalDateTime ldtWinter = zdtWinter.toLocalDateTime();