wake-up-neo.com

Java 8 DateTimeFormatter zweistellige Jahr 18 bis 0018 anstelle von 2018 analysiert?

Mit Java 8 werden im folgenden Code "18" anstelle von "2018" in das Jahr "0018" analysiert.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/y");
return LocalDate.parse(date, formatter);

eingabedatum ist "01/05/18".

1) Warum ist das Ergebnis "0018"? Entspricht DateTimeFormatter nicht der 80-20-Regel?

2) Wie steuere ich SimpleDateFormat parse auf 19xx oder 20xx? talked about SimpleDateFormat.set2DigitYearStart(Date) kann verwendet werden, um das Jahr zu korrigieren. Gibt es etwas Ähnliches für DateTimeFormatter?

Ich hatte gehofft, dass "M/d/y" sowohl zwei- als auch vierstellige Jahre parst.

"M/d/yy" löst eine Ausnahme für vierstellige Jahre aus und analysiert "01/05/97" bis "2097-01-05". Idealerweise sollte dies auf "1997-01-05" geparst werden.

"M/d/yyyy" wirft eine Ausnahme für zweistellige Jahre.

6
Jesse Zhuang

Es gibt keine einzige Zeichenfolge von y oder u, mit der Sie zwei- und vierstellige Jahreszahlen analysieren können. Sie können jedoch optionale Teile in der Formatmusterzeichenfolge verwenden, um anzugeben, dass ein zwei- oder vierstelliges Jahr vorhanden sein kann:

public static LocalDate parseDateString(CharSequence date) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/[uuuu][uu]");
    return LocalDate.parse(date, formatter);
}

Versuch es:

    System.out.println(parseDateString("01/05/18"));
    System.out.println(parseDateString("01/06/2018"));

Dies gedruckt:

2018-01-05
2018-01-06

In der Formatmusterzeichenfolge müssen Sie zuerst die vierstellige Jahreszahl eingeben. Bei der umgekehrten Reihenfolge beim Versuch, ein vierstelliges Jahr zu analysieren, analysiert der Formatierer zwei Ziffern, entscheidet, dass dies bis jetzt erfolgreich war, und beschwert sich dann nach zwei Ziffern über nicht geparsten Text.

Wenn Sie genauer steuern möchten, wie zweistellige Jahre interpretiert werden:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("M/d/")
            .optionalStart()
            .appendPattern("uuuu")
            .optionalEnd()
            .optionalStart()
            .appendValueReduced(ChronoField.YEAR, 2, 2, 1920)
            .optionalEnd()
            .toFormatter();

Wenn Sie dieses Formatierungsprogramm in der obigen Methode verwenden, versuchen Sie Folgendes:

    System.out.println(parseDateString("01/05/22"));

Dies druckt:

1922-01-05

Wenn Sie 1920 als Basis angeben (wie in meinem Beispielcode), werden zweistellige Jahre im Intervall von 1920 bis 2019 enden. Passen Sie den Wert an Ihre Anforderungen an.

9
Ole V.V.

Ändern Sie Ihren Formatter-String in "M/d/yy".

0
Vishal Raja