Бросить исключение в случае неоднозначной даты-времени для часового пояса?
С использованием 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)