Ответ 1
Ваш образец не генерирует исключение, потому что ZonedDateTime.of(..)
настраивает дату. javadoc утверждает
Это создает зонированную дату-время, соответствующую входному локальному дате-времени, как насколько это возможно. Правила часовых поясов, такие как переход на летнее время, означают что не все локальные даты-даты действительны для указанной зоны, таким образом может быть скорректировано локальное время-дата.
Вы можете использовать ZonedDateTime#ofStrict(LocalDateTime, ZoneOffset, ZoneId)
для выполнения проверки.
Получает экземпляр ZonedDateTime, строго проверяющий сочетание локальных дат-времени, смещения и идентификатора зоны.
Это создает зонированную дату-время, гарантирующую, что смещение действительно для локальная дата-время в соответствии с правилами указанной зоны. Если смещение недействительно, генерируется исключение.
Сначала вам нужно построить LocalDateTime
. Затем вы получите ZoneOffset
для своего ZoneId
для этого локального времени. Затем вы можете предоставить все три символа ofStrict
.
Например,
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)