DateTimeFormatter-Unterstützung für einstelligen Tag im Monat und Monat im Jahr

Lesezeit: 2 Minuten

Benutzer-Avatar
Markus Maxy

DateTimeFormmater scheint den einstelligen Tag des Monats nicht zu verarbeiten:

String format = "MM/dd/yyyy";
String date   = "5/3/1969";
System.out.println(new SimpleDateFormat(format).parse(date));
System.out.println(LocalDate.parse(date, DateTimeFormatter.ofPattern(format)));

In diesem Beispiel SimpleDateFormat korrekt analysiert das Datum, aber DateTimeFormatter wirft eine Ausnahme. Wenn ich null aufgefüllte Daten verwenden würde, zB “05.03.1969”, funktionieren beide. Wenn jedoch entweder der Tag des Monats oder der Monat des Jahres einstellig sind, dann DateTimeFormatter wirft eine Ausnahme.

Was ist das Recht DateTimeFormatter Format, um sowohl den ein- als auch den zweistelligen Tag des Monats und den Monat des Jahres zu analysieren?

  • Haben Sie dieses Problem gelöst? Ich suche auch nach einer Java8-Lösung, um 1 oder 2 Ziffern für den Monat oder 2 oder 4 Ziffern für das Jahr zu analysieren.

    – Benutzer607455

    12. März 2015 um 15:52 Uhr

Aus die Dokumentation:

Nummer: Bei einer Buchstabenanzahl von eins wird der Wert mit der minimalen Stellenzahl und ohne Padding ausgegeben.

Der gewünschte Formatbezeichner ist also M/d/yyyy, mit Einzelbuchstabenformen. Natürlich wird es immer noch das Datum analysieren Stringist wie "12/30/1969" korrekt wie bei diesen Tages-/Monatswerten sind zwei Ziffern die „Mindestanzahl von Ziffern“.

Der wichtige Unterschied ist der MM und dd erfordern kein Auffüllen, nicht das M und d kann keine Werte größer als 9 verarbeiten (das wäre etwas … ungewöhnlich).

  • Ich hatte das gleiche Problem in Dart, aber mit der obigen Lösung, die mit dem intl-Paket implementiert wurde, funktioniert es jetzt ordnungsgemäß. Vielen Dank.

    – Raja C

    30. Juni 2020 um 16:15 Uhr

  • Dieser hat funktioniert, gut erklärt @Holger. Link zur Dokumentation war auch hilfreich.

    – Vishwas Shenoy Alevoor

    14. Dezember 2021 um 18:18 Uhr

Benutzer-Avatar
Joginder Malik

In Java 8 Date Time API habe ich kürzlich verwendet

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendOptional(DateTimeFormatter.ofPattern("M/dd/yyyy"))
            .toFormatter();

System.out.println(LocalDate.parse("10/22/2020", formatter));
System.out.println(LocalDate.parse("2/21/2020", formatter));

  • Warum das zweite Muster einbeziehen? Welchen Wert würden Sie erwarten, dass er vom zweiten, aber nicht vom ersten analysiert wird?

    – Jon Skeet

    15. Februar 2021 um 16:30 Uhr

  • @JonSkeet sehr guter Vorschlag von dir. Ich habe gerade das zweite Muster entfernt, da ein einzelnes Muster beide Arten von Werten wie 22.10.2020 und 22.02.2020 analysieren kann

    – Joginder Malik

    22. Februar 2021 um 18:00 Uhr

  • das ist eine tolle Lösung. Ich könnte mehrere Muster hinzufügen. Danke

    – Benutzer7510999

    11. Oktober 2021 um 14:43 Uhr

Der beste Ansatz, um mit dieser Art von Problem umzugehen, das ist die Anzahl der verschiedenen Ziffern im Datum (in Tag, Monat oder Jahr), ist die Verwendung dieses Musters: (M/d/[uuuu][uu]) .

Beispiel:

String date = "7/7/2021"; // or "07/07/2021" or "07/7/21" etc
LocalDate localDate = LocalDate.parse(
date,DateTimeFormatter.ofPattern("M/d/[uuuu][uu]"));

Hier handhaben uuuu/uu vier- und zweistellige Jahreszahlen.

1159040cookie-checkDateTimeFormatter-Unterstützung für einstelligen Tag im Monat und Monat im Jahr

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy