2012-10-26 15 views
17

SimpleDateFormat ist ein sehr freundlicher Parser, der das resultierende Datum rollt, anstatt einen Fehler zu werfen. Wie kann ich ein Datum strengstens ohne Regexps usw. analysieren?Java: Wie man ein Datum streng analysiert?

fmt = new SimpleDateFormat("dd.MM.yyyy") 
fmt.parse("10.11.2012") // it works 
fmt.parse("10.1150.2012") // it works but it's unwanted 
+3

es kann oder kann nicht lösen Ihr Problem, aber, wenn Sie mit Daten in Java beschäftigen, würde ich die Joda Time-Bibliothek dringend empfehlen – Eduardo

Antwort

31

fmt.setLenient(false); ist was du suchst.

+6

Traurig Einstellung nachsichtig ist immer noch nachsichtig. "2010/01/5" ist für das Muster "JJJJ/MM/TT" erlaubt. 20100901andGarbage "ist für das Muster" yyyyMMdd "erlaubt. Ich habe eine Antwort gepostet, die strikte Übereinstimmungen mit einer Klasse garantiert, die SimpleDateFormat erweitert. –

+0

Das doc von java.text.DateFormat.parse sagte" Die Methode darf nicht den gesamten Text von die angegebene Zeichenfolge. ", so ist das Verhalten richtig. – Germinate

9

java.time

Sie können auch die java.time package in Java 8 und höher verwenden (Tutorial). Seine Analyse überprüft streng die Datumswerte.

Zum Beispiel:

String strDate = "20091504"; 
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate); 

Gibt direkt:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20091504' could not be parsed: 
Invalid value for MonthOfYear (valid values 1 - 12): 15 
+0

' DateTimeFormatter' hat drei Resolverstile (im Vergleich zu 'DateFormat's zwei): streng, smart und nachsichtig. Glücklicherweise ist Smart der Standard, es fängt die meisten unerwünschten Eingaben und vielleicht alles, was Englisch: www.doc-o-matic.com/webhelp/Tdlg.html Dies ist eindeutig falsch, für eine noch strengere Validierung können Sie natürlich den strikten Resolver - Stil ausprobieren) ist eher informativ. –

2

Leider fmt.setLenient (false); erreicht keine strikte Datumsformatierung. Es hilft einigen, zum Beispiel Parsing "2010-09-01" mit dem Format "yyyyMMdd" wird gelingen, wenn nachsichtig == wahr, aber das Ergebnis ist sehr seltsam: 2009/12/09.

Auch wenn nachsichtig == false parse() noch nachsichtig agiert. "2010/01/5" ist für das Muster "JJJJ/MM/TT" erlaubt. Und Daten Meinungsverschiedenheiten wie "1999/2011" für das Muster "JJJJ/JJJJ" wird toleriert (nach 2011). Müll ist auch erlaubt, nachdem das Muster übereinstimmt. Zum Beispiel: "20100901" und "20100901andGarbage" stimmen beide mit "yyyyMMdd" überein.

Ich habe eine Erweiterung von SimpleDateFormat geschrieben, die strenge Mustererkennung erzwingt. Sie können es hier finden:

SimpleDateFormat.parse() ignores the number of characters in pattern

In meiner Version Format() und analysieren() sind funktional Umkehrungen. Das ist, was ich denke, dass die meisten Leute erwarten würden.

Verwandte Themen