DateTimeFormatter-Monat-Muster-Buchstaben "L" nicht

Bemerkte ich, dass java.Zeit.format.DateTimeFormatter - ist nicht in der Lage zu analysieren, wie erwartet. Siehe unten:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Play {
  public static void tryParse(String d,String f) {
    try { 
      LocalDate.parse(d, DateTimeFormatter.ofPattern(f)); 
      System.out.println("Pass");
    } catch (Exception x) {System.out.println("Fail");}
  }
  public static void main(String[] args) {
    tryParse("26-may-2015","dd-L-yyyy");
    tryParse("26-May-2015","dd-L-yyyy");
    tryParse("26-may-2015","dd-LLL-yyyy");
    tryParse("26-May-2015","dd-LLL-yyyy");
    tryParse("26-may-2015","dd-M-yyyy");
    tryParse("26-May-2015","dd-M-yyyy");
    tryParse("26-may-2015","dd-MMM-yyyy");
    tryParse("26-May-2015","dd-MMM-yyyy");
  }
}

Nur der Letzte Versuch mit tryParse("26-May-2015","dd-MMM-yyyy"); wird "Pass". Gemäß der Dokumentation LLL sollte in der Lage sein, zu analysieren textuellen format. Beachten Sie auch den feinen Unterschied des Großbuchstabens 'M' vs Kleinbuchstaben "m".

Dies ist wirklich ärgerlich, da ich nicht standardmäßig analysiert strings formatiert standardmäßig von Oracle-DB -

SELECT TO_DATE(SYSDATE,'DD-MON-YYYY') AS dt FROM DUAL;

Ebenso für das folgende Programm:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Play {
  public static void output(String f) {
    LocalDate d = LocalDate.now();
    Locale l = Locale.US;
    //Locale l = Locale.forLanguageTag("ru");
    System.out.println(d.format(DateTimeFormatter.ofPattern(f,l)));
  }
  public static void main(String[] args) {
    output("dd-L-yyyy");
    output("dd-LLL-yyyy");
    output("dd-M-yyyy");
    output("dd-MMM-yyyy");
  }
}

Bekomme ich unter der Ausgabe:

28-5-2015
28-5-2015
28-5-2015
28-May-2015

Klar die L Formatbezeichner nicht alles behandelt, der Text scheint numerische mir ...

Jedoch, wenn ich die Locale auf Locale.forLanguageTag("ru") bekomme ich folgende Ausgabe:

28-5-2015
28-Май-2015
28-5-2015
28-мая-2015

Alle wirklich interessant, würden Sie nicht Zustimmen?

Fragen, die ich habe sind:

  • Ist es sinnvoll für mich, um zu erwarten, dass jeder der arbeiten sollte?
  • Sollten wir zumindest uns einige wenige dieser als Fehler?
  • Ich missverstehen die Verwendung des L Muster-Bezeichner.

Zitieren einen Teil aus der Dokumentation, die ich percieved als 'es darauf ankommt':

Text: Den Stil des Textes bestimmt wird, basierend auf der Anzahl der Muster
Buchstaben verwendet. Weniger als 4 Buchstaben Muster wird die Kurzform verwendet.
Genau 4 Buchstaben Muster wird die volle form. Genau 5 Muster
Briefe verwenden Sie die schmale form. Muster Buchstaben 'L', 'c' und 'q'
geben Sie die stand-alone-form der text-Stile
.

- Nummer:, Wenn die Anzahl der Buchstaben ein, dann wird der Wert ausgegeben, mit
die minimale Anzahl von Ziffern und ohne Polsterung. Ansonsten, der Graf
der stellen ist als die Breite der Ausgabe-Feld mit dem Wert
mit Nullen aufgefüllt, wie nötig. Die folgenden Musterbuchstaben haben
Einschränkungen auf die Anzahl der Buchstaben. Nur ein Buchstabe von 'c' und 'F'
angegeben werden können. Bis zu zwei Buchstaben 'd', 'H', 'h', 'K', 'k', 'm',
und 's' kann angegeben werden. Bis zu drei Buchstaben von " D " kann angegeben werden.

Zahl/Text: , Wenn die Anzahl der Musterbuchstaben ist 3 oder größer ist, verwenden Sie die
Text oben genannten Regeln
. Andernfalls verwenden Sie die Nummer oben genannten Regeln.

UPDATE

Habe ich gemacht, zwei Beiträge zu Oracle:

  • Anfrage für Bugfix für das LLL (Long Text) Ausgabe: JDK-8114833 (original-oracle-Review ID: JI-9021661)
  • Request for enhancement für die Kleinbuchstaben Monat parsing-Problem: Überprüfen Sie die ID: 0 (ist das auch ein bug??)
  • Aus meiner (eingeschränkten) Prüfung L steht für 5 oder 05 (für Mai), wo, wie M stehen kann 5 (M) oder 05 (MM) oder May (MMM). Ich denke, die DateTimeFormatter ist sehr streng in seiner Analyse, ist das ein bug oder ist das die Art und Weise es entworfen wurde? Schwer zu sagen jetzt, aber ich würde sagen, es ist ein design wählen
  • In der Dokumentation heißt es: "Muster-Buchstaben 'L', 'c' und 'q' geben Sie die stand-alone-form der text-Stile".
  • Sicher, aber aus dem test und meinen Tests L ist für zahlen, aber M, basierend auf wie viele Sie haben, kann bedeuten, dass beide zahlen und text, versuchen System.out.println(DateTimeFormatter.ofPattern("dd-LLL-yyyy").format(LocalDate.now())); und sehen 😉
  • In der JavaDoc: M und L sind behandelt mit dem Vortrag "Zahl/text". Beide Briefe sind auch darauf hingewiesen, wie "M/L". Also das Muster LLL muss textlichen wie MMM (Abkürzung) nicht numerische daher das beobachtete Verhalten ist ein bug. Über die Muster mit dem einzigen Buchstaben M und L, die numerische Ausgabe ist okay.
  • Überraschend für mich: Selbst die low-level-Ansatz mit new DateTimeFormatterBuilder().appendText(ChronoField.MONTH_OF_YEAR, TextStyle.SHORT_STANDALONE).toFormatter(Locale.US) produziert immer noch eine Zahl und nicht ein text (in Deutsch, "3" statt "Mar" für März). So, fürchte ich kein workaround im Rahmen des JSR-310 (java.Zeit-Paket) ist für Sie verfügbar, nur mit einer externen Bibliothek. Ich bin gespannt zu erfahren, ob Oracle qualifiziert dies als bug oder als feature, oder warten Sie für eine lange Zeit, bis der Fehler wird zu einer Funktion.
  • Übrigens, darf ich Sie Fragen, warum Sie die Verwendung von Oracle-DBs-Formatierung Fähigkeiten? Warum nicht einfach ein lokal-neutral numerischer form in Oracle? Und was ist Ihr Aktueller workaround?
  • Haben Sie legte eine Fehler-Nachricht an Oracle in der Zwischenzeit?
  • eingereicht 2 Elemente mit oracle. Ich habe eine Schicht von Unix in der Mitte, meine DB und meine Java-Programme, also je nach textlicher Darstellungen nicht interne binäre Datenformate. Mein workaround war, nur um eine Einigung auf ein format, das nicht von auf die textuelle Repräsentation des Monats wähle ich dd-MM-yyyy.
  • wählen Sie ISO-8601-format wie yyyy-MM-dd das ist genau das, konzipiert für den technischen Datenaustausch. Extra-Vorteil: Seine lexikographische Ordnung ist auch eine zeitliche ein. Hm, ich finde nicht die JI-9021661. Habt Ihr keinen öffentlichen link zu diesem Bericht?
  • Das sieht aus wie eine temporäre ID, wie er wartet, interne überprüfung. Ich habe gerade eine Antwort von einer Oracle engineer für weitere Informationen, die mir eine neue Referenz # Incident Report 9059262. Keine links. ISO-8601 war meine erste Wahl, aber war nicht unterstützt durch eine 3rd-party-tool auch im Einsatz.
  • Siehe bugs.openjdk.java.net/browse/JDK-8114833

InformationsquelleAutor YoYo | 2015-05-28
Schreibe einen Kommentar