Java: Wie um ein Datum zu analysieren streng?
"=SimpleDateFormat ist eine sehr freundliche parser, rollt sich das resultierende Datum statt der Ausgabe einer Fehlermeldung. Wie kann ich parse ein Datum, streng, ohne regexps etc?
fmt = new SimpleDateFormat("dd.MM.yyyy")
fmt.parse("10.11.2012") //it works
fmt.parse("10.1150.2012") //it works but it's unwanted
- es kann oder kann nicht Ihr problem lösen, aber, wenn Sie sind den Umgang mit Daten in Java würde ich dringend empfehlen die Joda Time Bibliothek
Du musst angemeldet sein, um einen Kommentar abzugeben.
fmt.setLenient(false);
ist, was Sie suchen.java.Zeit
Können Sie auch die java.Zeit-Paket in Java 8 und später (Tutorial). Ihre Analyse streng prüft die Datums-Werte.
Beispiel:
Gibt direkt:
DateTimeFormatter
hat drei resolver-Stile (im Vergleich zuDateFormat
's zwei): streng, klug und nachsichtig. Glücklicherweise smart ist das Standard, wird es zu fangen die meisten unerwünschten input, und vielleicht alles, das ist eindeutig falsch. Für noch strengere überprüfung können Sie natürlich versuchen, die strengen resolver-Stil. Die Dokumentation ist eher informativ.Leider fmt.setLenient(false); erreichen nicht die strenge Formatierung des Datums an. Es hilft, einige, zum Beispiel analysieren "2010-09-01" mit format "JJJJMMTT" erfolgreich sein wird, wenn nachsichtig==true, aber das Ergebnis ist sehr Bizarr: 2009/12/09.
Selbst wenn nachsichtig==false parse () - noch immer wirkt nachsichtig. "2010/01/5" erlaubt, die für das Muster "yyyy/MM/dd". Und Daten Uneinigkeit wie "1999/2011" für das Muster "yyyy/yyyy" wird toleriert (von 2011). Müll ist auch erlaubt nach dem Muster übereinstimmen. Zum Beispiel: "20100901" und "20100901andGarbage" beide passen "JJJJMMTT".
Ich geschrieben habe eine Erweiterung von " = SimpleDateFormat, erzwingt strict pattern matching. Sie können es hier finden:
"=SimpleDateFormat.parse() ignoriert die Anzahl der Zeichen im Muster
In meiner version format() und parse() sind funktional inversen. Dies ist, was ich denke, die meisten Leute erwarten würden.