M. Shorly:
Je voudrais créer un DateTimeFormatter qui accepte différents types de formats tels que: « 2018 », « 02/01/2018 » ou « 02/01/2018 10:15 ». J'ai essayé de le construire comme ceci:
DateTimeFormatter f1 = new DateTimeFormatterBuilder()
.appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]")
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.toFormatter();
LocalDateTime.parse("2018-01", f1); // no problem
LocalDateTime.parse("2018", f1); // exception
La deuxième ligne donne l'exception suivante:
java.time.format.DateTimeParseException: Text '2018' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {Year=2018},ISO of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
Cette formatter fonctionnera pour tous mes cas, sauf pour le simple « 2018 ». Quelqu'un peut-il me dire pourquoi?
Étrangement le formatter de la prochaine codeblock acceptera le « 2018 »:
DateTimeFormatter f2 = new DateTimeFormatterBuilder()
.appendPattern("yyyy[-MM[-d]]")
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.toFormatter();
LocalDate.parse("2018", f2); // no problem
DaveyDaveDave:
Je pense que vous avez juste entre crochets mal appareillés.
J'ai essayé votre exemple d'origine:
DateTimeFormatter f1 = new DateTimeFormatterBuilder()
.appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]")
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.toFormatter();
et obtenir la même exception que vous, mais quand j'ajoute un plus ]
, cela fonctionne comme prévu, de sorte que cela fonctionne pour moi:
DateTimeFormatter f1 = new DateTimeFormatterBuilder()
.appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]]")
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.toFormatter();
Pour aider à comparer:
.appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]") // throws exception
.appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]]") // works fine