Me esperaba una excepción de:
LocalDate.parse("9/31/2018",DateTimeFormatter.ofPattern("M/d/yyyy"));
pero en lugar de eso Tienes 30 Sep, 2018 !? No me malinterpreten, es bueno que es ser inteligente, pero que han llegado a esperar un mayor nivel de precisión de las clases Fecha de Java ...
¿Alguien puede arrojar algo de luz sobre cómo / por qué? Esto va a meterse con mis pruebas.
Esto se debe a la ResolverStyle
utilizada por el formateador para analizar el valor. Por defecto (al menos en mi máquina) que es "inteligente":
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.
... pero se puede hacer más "estricta" en su lugar, en cuyo caso el análisis de falla. Ejemplo completo (usando u
en lugar de y
evitar la ambigüedad de no especificar una era):
import java.time.*;
import java.time.format.*;
public class Test {
public static void main (String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/uuuu");
// With the "smart" resolver style, it parses
System.out.println(formatter.getResolverStyle());
LocalDate date = LocalDate.parse("9/31/2018", formatter);
System.out.println(date);
// But with a strict style...
formatter = formatter.withResolverStyle(ResolverStyle.STRICT);
LocalDate.parse("9/31/2018", formatter);
}
}