Бросить исключение в случае неоднозначной даты-времени для часового пояса?

С использованием java.time пакет:

Я преобразовываю пользовательский ввод свободно вставленной даты-времени (год, месяц, день, час, минута) в LocalDateTime и затем, согласно часовому поясу пользователя, ZonedDateTime,

Пример для Эстонии:

LocalDateTime local = LocalDateTime.of(2018, 10, 28, 3, 30); // October 28th 03:30
ZonedDateTime zoned = local.atZone(ZoneId.of("Europe/Tallinn"));

Вышеуказанное время 03:30 может означать два случая на временной шкале, потому что 28 октября 2018 года летнее время в Эстонии закончилось. В 04:00 GMT+3 часы были заменены на 03:00 GMT+2, что означает, что время 03:30 было достигнуто дважды за этот день. Согласно документации atZone() итоговое время конвертации - летнее время 03:30 по Гринвичу +3 (выделено мое):

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

То, что я хотел бы, чтобы это преобразование не было выполнено неявно. Вместо этого я хотел бы поймать исключение и сообщить пользователю о неоднозначном вводе. Кажется, есть способ сделать это, но я не понимаю, почему метод является статическим и принимает три аргумента. Как правильно использовать его для моего случая? Из той же документации:

Чтобы сгенерировать исключение при наличии разрыва или перекрытия, используйте ZonedDateTime.ofStrict(LocalDateTime, ZoneOffset, ZoneId),

Почему он просит ZoneOffset аргумент? Мне кажется, все, что мне нужно, это LocalDateTime а также ZoneId, В противном случае, каждый раз, когда я преобразую в ZonedDateTime Как узнать, использовать ли смещение GMT ​​+ 2 или GMT+3? Это то, что я хочу, чтобы Java говорила мне или генерировала исключение, если применимы оба.

1 ответ

Я нашел ответ и пометил свой вопрос как дубликат.

ZoneId zoneId = ZoneId.of("America/Chicago");
LocalDateTime ldt = LocalDateTime.of(2017, 3, 12, 2, 39, 0, 0);
ZoneOffset zoneOffset = zoneId.getRules().getOffset(ldt);
ZonedDateTime zdt = ZonedDateTime.ofStrict(ldt, zoneOffset, zoneId);

бросил бы

Exception in thread "main" java.time.DateTimeException: LocalDateTime '2017-03-12T02:39' does not exist in zone 'America/Chicago' due to a gap in the local time-line, typically caused by daylight savings
    at java.time.ZonedDateTime.ofStrict(ZonedDateTime.java:484)
Другие вопросы по тегам