¿Por qué puedo analizar una cadena de fecha y hora en Java con una hora no válida? ¿Qué he perdido o necesita hacer para asegurar que se genera un error de manera apropiada.
El siguiente código no arroja un error, cuando lo que debería?
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
LocalDateTime aFormattedDate = LocalDateTime.parse("2019-01-01T24:00:00", dateTimeFormatter); // returns 2019-01-02T00:00:00, should throw an error
Especificación de la hora 25, o incluso cualquier otro componente de milisegundos o el tiempo no causa parse
para lanzar un error.
donde como
LocalDateTime aDate = LocalDateTime.parse("2019-01-01T24:00:00"); //throws an error
No generará un error - sobre HourOfDay debe estar comprendida entre 0 y 23 - como se esperaba
ResolverStyle
Debido a que DateTimeFormatter.ofPattern()
por defecto ResolverStyle.SMART
si no se especifica el estilo de resolución. SMART
permite por alguna conversionse.g. 24:00:00
se convertirá a al día siguiente pero 24:00:01
será una excepción. Según el javadoc enumeración:
Estilo de fechas y resolver veces en un inteligente o inteligente, de forma.
El uso de resolución inteligente interpretará el valor por defecto razonable para cada campo, que puede ser el mismo que estricta, lo mismo que indulgente, o una tercera comportamiento. Los campos individuales interpretarán esto de manera diferente.
Por ejemplo, la resolución de año-mes y el día de mes en el sistema de calendario ISO usando el modo inteligente se asegurará de que el día de mes es de 1 a 31, la conversión de cualquier valor más allá del último día de mes-de-válidos para ser el último día de mes válida.
LocalDateTime.parse()
utiliza ResolveStyle.STRICT
bajo el capó que hace que sea equivalente a:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss")
.withResolverStyle(ResolverStyle.STRICT);
LocalDateTime.parse("2019-01-01T24:00:00", fmt); // DateTimeParseException