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

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;
    }
}

2 ответа

Решение

Ваш образец не выдает исключение, потому что 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)

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

public static boolean isValid(LocalDateTime ldt, ZoneId zoneId) {
    return !zoneId.getRules().getValidOffsets(ldt).isEmpty();
}
Другие вопросы по тегам