Подтвердить что ты не робот

Как я могу проверить местное время даты в летнее время?

Mar 12, 2017 02:39:00 "America/Chicago" не существует. Когда я устанавливаю дату и время для этого значения, это не прерывается. Через час будет установлено значение Mar 12, 2017 03:39:00. Как я могу быть уведомлен о том, что этого времени не существует. Вот как время проскакивает вперед

01:59:59
3:00:00

Как вы можете видеть, 02:39:00 никогда не будет существовать в эту дату.

Вот код, который я использую

package com.company;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {

    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.of("America/Chicago");
        ZonedDateTime dateTimeStart = ZonedDateTime.of(2017, 1, 1, 15, 39, 0, 0, ZoneId.of("America/Chicago"));
        ZonedDateTime dateTimeStartUtc = dateTimeStart.withZoneSameInstant(ZoneOffset.UTC);

        ZoneId zoneIdDst = ZoneId.of("America/Chicago");
        ZonedDateTime dateTimeStartDst = ZonedDateTime.of(2017, 3, 12, 2, 39, 0, 0, ZoneId.of("America/Chicago"));
        ZonedDateTime dateTimeStartUtcDst = dateTimeStart.withZoneSameInstant(ZoneOffset.UTC);
        int y = 90;
    }
}
4b9b3361

Ответ 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)

Ответ 2

Здесь проверка без исключения исключений. Вам нужно только спросить правила зоны, если a LocalDateTime действителен в данный часовой пояс:

public static boolean isValid(LocalDateTime ldt, ZoneId zoneId) {
    return !zoneId.getRules().getValidOffsets(ldt).isEmpty();
}