Mar 12, 2017 02:39:00 "America/Chicago" no existe. Cuando configuro la fecha y la hora en este valor, no falla. La hora se establece en el Mar 12, 2017 03:39:00 una hora más tarde. ¿Cómo puedo ser notificado de que este tiempo no existe. Así es como el tiempo salta hacia adelante
01:59:59 3:00:00 Como puede ver, 02:39:00 nunca existirá en esta fecha.
Aquí está el código que estoy usando
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; } }Su muestra no genera una excepción porque ZonedDateTime.of(..) ajusta la fecha y la hora. Los estados javadoc
Esto crea una fecha y hora dividida en zonas que coincide lo más posible con la fecha y hora local de entrada. Las reglas de zona horaria, como el horario de verano, significan que no todas las fechas y horas locales son válidas para la zona especificada, por lo que se puede ajustar la fecha y hora locales.
Puede usar ZonedDateTime#ofStrict(LocalDateTime, ZoneOffset, ZoneId) para realizar la validación.
Obtiene una instancia de ZonedDateTime validando estrictamente la combinación de fecha y hora local, desplazamiento e ID de zona.
Esto crea una fecha y hora dividida en zonas que garantiza que la compensación sea válida para la fecha y hora local de acuerdo con las reglas de la zona especificada. Si el desplazamiento no es válido, se lanza una excepción.
Primero deberá construir un LocalDateTime . Luego obtendrá el ZoneOffset para su ZoneId para esa fecha y hora local. Luego puede proporcionar los tres a ofStrict .
Por ejemplo,
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);tiraría
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)Aquí una validación sin lanzar excepciones. Solo necesita preguntar a las reglas de la zona si un LocalDateTime es válido dentro de una zona horaria determinada:
public static boolean isValid(LocalDateTime ldt, ZoneId zoneId) { return !zoneId.getRules().getValidOffsets(ldt).isEmpty(); }