Java DateTimeFormatter n'analyse pas comme prévu [dupliquer]

Sep 02 2020

J'ai essayé DateTimeFormatter pour analyser la date d'entrée dd/MM/yyyy. J'ai utilisé le code ci-dessous

java.time.format.DateTimeFormatter ne parvient pas à analyser la date

  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;
    }

Contribution: 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

Il échoue également pendant les années bissextiles.

Réponses

1 deHaar Sep 02 2020 at 13:47

Vous avez essentiellement deux options (ici, où l'on utilise le que ResolverStylevous montrez dans votre exemple de code):

  • utiliser ResolverStyle.STRICTexplicitement une ⇒ analyse uniquement l' année u
  • utiliser une valeur par défaut ResolverStyle⇒ l' année de l'ère y ou l' année u sera analysée

L'exemple suivant montre les différences de code:

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 sortie est

2018-04-30
2018-04-30

donc les deux DateTimeFormatters analysent exactement la même chose String, mais celui sans ResolverStyleattachement explicite utilisera ResolverStyle.SMARTpar défaut selon les JavaDocs deDateTimeFormatter .

Bien sûr, un motif avec l' année ( u) sera analysé par ResolverStyle.SMART, aussi, donc

DateTimeFormatter.ofPattern("dd/MM/uuuu");

serait également une option.

Une bonne explication de la différence entre l' année de l'ère et l' année peut être trouvée dans cet article .

3 layonez Sep 02 2020 at 13:43

Le problème utilise .withResolverStyle(ResolverStyle.STRICT)nécessite d'utiliser le modèle d'année uuuu au lieu de yyyy (c'est-à-dire "année" au lieu de "année de l'ère")