Java DateTimeFormatter n'analyse pas comme prévu [dupliquer]
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
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éeu - utiliser une valeur par défaut
ResolverStyle⇒ l' année de l'èreyou l' annéeusera 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 .
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")