ZonedDateTime
как представляется , не позволяют обнаружить , если дата , указанная в зазоре DST или перекрытия. Документы говорят для of
метода (создание ZonedDateTime
):
В случае перекрытия, когда часы установлены назад, есть два действительные смещение. Этот метод использует ранее смещение, как правило, соответствующие «летом».
В случае разрыва, когда часы прыгать вперед, нет никакого действительного смещения. Вместо этого, локальная дата-время корректируется, чтобы быть позже по длине зазора.
^ Как прочитанные выше, этот метод просто возвращает значение, но не позволит мне знать, если происходит разрыв DST или перекрытие.
Я хотел бы знать, если дата, указанная в зазоре или перекрытиях, и имеет дату начала и дату окончания разрыва или перекрытие.
Например:
«1920-09-01 00:10» для временной зоны «Африка / Акра» находится в промежутке DST .
Разрыв с "1920-09-01 00: 00: 00 + 00: 00" до "1920-09-01 00: 20: 00 + 00: 20" .
«1920-12-30 23:50» для временной зоны «Африка / Акра» находится в DST перекрытия .
Перекрывания относится к периодам:
"1920-12-30 23: 40: 00 + 00: 20" до "00 1920-12-31: 00: 00 + 00: 20" и
«1920-12-30 23:40: 00 + 00: 00" до "1920-12-31 00: 00: 00 + 00: 00"
Как я могу получить эти даты в случае разрыва или перекрытия, как в приведенных выше примерах?
Я не думаю , что это физически возможно создать ZonedDateTime
что при переходе зазора, так как местное время даты , что разрыв переход пропускает технически «не существует», и ZonedDateTime
довольно строг об этом. В зависимости от способа, он будет либо выбросить исключение или приспособиться к времени , которое существует.
Вы должны сделать эту проверку с LocalDateTime
с, не ZonedDateTime
с.
ZoneRules
имеет это очень удобный метод , называемый , getTransition
который принимает LocalDateTime
и дает вам ZoneOffsetTransition
, что представляет собой переход зазора / перекрытия, или null
если дата время не переход. Пример:
System.out.println(ZoneId.of("Africa/Accra").getRules()
.getTransition(LocalDateTime.of(1920, 9, 1, 00, 10)));
Выход:
Transition[Gap at 1920-09-01T00:00Z to +00:20]
Вы можете получить всю информацию , которую вы хотите (начало, конец, смещение до того , смещение после зазора / перекрытия и т.д.) от ZoneOffsetTransition
объекта.