2009-12-15 10 views
40

Ich verwende java.text.SimpleDateFormat, um Zeichenfolgen des Formulars "yyyyMMdd" zu analysieren.Machen Sie SimpleDateFormat.parse() an ungültigen Daten fehl (z. B. Monat ist größer als 12)

Wenn ich versuche, eine Zeichenfolge mit einem Monat größer als 12 zu analysieren, anstatt zu versagen, wird das nächste Jahr angezeigt. Voll runnable Repro:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ParseDateTest { 

    public static void main(String[] args) throws ParseException { 

     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     Date result = format.parse("20091504"); // <- should not be a valid date! 
     System.out.println(result); // prints Thu Mar 04 00:00:00 CST 2010 
    } 
} 

Ich hätte lieber eine ParseException geworfen.

Gibt es eine nicht-hacky Art, die Ausnahme zu erzwingen ?. Ich meine, ich möchte nicht manuell überprüfen, ob der Monat größer als 12 ist. Das ist irgendwie lächerlich.

Danke für jeden Vorschlag.

HINWEIS: Ich weiß bereits über Joda Time, aber ich brauche dies in Plain JDK ohne externe Bibliotheken getan.

Antwort

96

Sie müssen es non-lenient machen. Also,

format.setLenient(false); 

sollte es tun.

+6

Vielen Dank. Das hat den Trick gemacht. Erstaunlich, wie das Stellen von Fragen hier Ergebnisse schneller als das Suchen auf Google gibt (oder ich lutsche beim Suchen :). –

+2

+1 für den einen Liner. –

+2

stackoverflow sollte Benutzern erlauben, mehr als 1 Punkt zu Antworten geben, und dies ist eine dieser Antworten. Ich habe vor dem Parsen mit SimpleDateFormat einige lächerliche Muster gefunden. Danke vielmals. –

3

Sie können die Java 8-Zeit-API verwenden. Wenn Sie mit dem Beispiel, das Sie einen Monat mit einem Wert von 15 verwenden:

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

In Kürze erhalten Sie direkt eine Ausnahme haben

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