Как я могу проверить местное время в летнее время?
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();
}