DateTimeParseException pour DateTimeFormatter avec motif "aaaa [-MM [-d [HH [: mm [: ss [.sss]]]]]"

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

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=190117&siteId=1
conseillé
Classement