Как получить разрыв DST и перекрытие?

user2923322:

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"

Как я могу получить эти даты в случае разрыва или перекрытия, как в приведенных выше примерах?

Sweeper:

Я не думаю , что это физически возможно создать 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объекта.

рекомендация

отhttp://10.200.1.11:23101/article/api/json?id=478578&siteId=1