Java DateTimeFormatter no se analiza como se esperaba [duplicado]

Sep 02 2020

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

1 deHaar Sep 02 2020 at 13:47

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ño u
  • usar un valor predeterminado ResolverStyle⇒ se analizará el año de la era y o el año u

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 .

3 layonez Sep 02 2020 at 13:43

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").