Java DateTimeFormatter no se analiza como se esperaba [duplicado]
Intenté DateTimeFormatter para analizar la fecha de entrada dd/MM/yyyy. He usado el siguiente código
java.time.format.DateTimeFormatter no puede analizar la fecha
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy").withResolverStyle(ResolverStyle.STRICT);
try {
LocalDate.parse(dateField, dateFormatter);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
Entrada: 30/04/2018
Error:Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=4, YearOfEra=2018, DayOfMonth=30},ISO of type java.time.format.Parsed
También está fallando en los años bisiestos.
Respuestas
Básicamente, tiene dos opciones (aquí, donde una usa el ResolverStyleque está mostrando en su ejemplo de código):
- use un
ResolverStyle.STRICTexplícitamente ⇒ analiza solo el añou - usar un valor predeterminado
ResolverStyle⇒ se analizará el año de la erayo el añou
El siguiente ejemplo muestra las diferencias en el código:
public static void main(String[] args) {
String date = "30/04/2018";
// first formatter with year-of-era but no resolver style
DateTimeFormatter dtfY = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// second one with year and a strict resolver style
DateTimeFormatter dtfU = DateTimeFormatter.ofPattern("dd/MM/uuuu")
.withResolverStyle(ResolverStyle.STRICT);
// parse
LocalDate localDateU = LocalDate.parse(date, dtfU);
LocalDate localDateY = LocalDate.parse(date, dtfY);
// print results
System.out.println(localDateU);
System.out.println(localDateY);
}
La salida es
2018-04-30
2018-04-30
por lo que ambos DateTimeFormatteranalizan lo mismo String, pero el que no tiene un ResolverStyleadjunto explícitamente se usará ResolverStyle.SMARTpor defecto de acuerdo con los JavaDocs deDateTimeFormatter .
Por supuesto, con un patrón años ( u) será analizado por ResolverStyle.SMART, también, por lo
DateTimeFormatter.ofPattern("dd/MM/uuuu");
también sería una opción.
En esta publicación se puede encontrar una buena explicación de la diferencia entre año de era y año .
El problema es que se .withResolverStyle(ResolverStyle.STRICT)requiere usar el patrón de año uuuu en lugar de yyyy (es decir, "año" en lugar de "año de la era").