Как получить разрыв DST и перекрытия? - PullRequest
2 голосов
/ 09 февраля 2020

ZonedDateTime, по-видимому, не позволяет определить, находится ли указанная дата в разрыве или перекрытии летнего времени. Документы говорят для метода of (создание ZonedDateTime):

В случае наложения, когда часы возвращаются назад, есть два допустимых смещения. Этот метод использует более раннее смещение, обычно соответствующее «лету».

В случае разрыва, когда часы прыгают вперед, действительного смещения нет. Вместо этого местная дата-время корректируется, чтобы быть позже на длину промежутка.

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

Я хотел бы знать, находится ли указанная дата в промежутке или перекрытии и имеет ли дату начала и окончания окончания промежутка или перекрытия.

Например:

"1920-09-01 00:10" для часового пояса "Африка / Аккра" находится в Разрыве по летнему времени .
Разрыв составляет от "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" до "1920-12-31 00: 00: 00 + 00: 20" и
"1920-12-30 23: 40: 00 + 00: 00" до "1920-12-31 00: 00: 00+ 00:00 "

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

1 Ответ

3 голосов
/ 09 февраля 2020

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

Затем вы можете получить всю необходимую информацию (начало, конец, смещение до, смещение после, разрыв / наложение и т. Д. c) от объекта ZoneOffsetTransition.

...