2015-07-30 11 views
9

Ich habe einen Java-Code, der Datum in einem bestimmten Format eingibt.Warum akzeptiert SimpleDateFormat.parse eine ungültige Datumszeichenfolge?

static Date parseDate(String userInput){ 
     DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     Date date = null; 
     try { 
      date = format.parse(userInput); 
      System.out.println(date); 
     }catch(ParseException pe){ 
      date=null; 
      System.out.println("Not a valid date"); 
     } 
     return date; 
    } 

Jetzt bin ich Eingabe 2015-13-11 89:90:90, die ein ungültiges Datum ist. Aber es gibt Thu Jan 14 18:31:30 IST 2016 als Datum zurück. Warum ist das so? Wie kann ich null als Datum zurückgeben?

+0

Okay, ich habe verpasst, dass Sie es falsch eingegeben haben;) – DigitalNinja

Antwort

14

Vom Blick des javadocs, scheint es ein lenient Modus Parsing werden, bei dem es schlecht Eingang formatiert akzeptiert:

diese Linie

format.setLenient(false); 

nach der Initialisierung des Date Objekt hinzufügen scheint es zu beheben.

+0

Das hilft, danke. – inquisitive

4

Ich werde versuchen zu erklären warum das passiert.

Das Datum ist anders, da die Werte, die das Maximum ihrer Felder überschreiten, in das nächstgrößere Feld gerollt werden.

Ich bin nicht sicher, in welcher Reihenfolge sie behoben ist, aber hier ist das, was in der Regel geschieht:

2015-13-11 Angesichts 89:90:90

  1. Das Jahr als interpretiert 2015, das ist richtig eingestellt. Aktuell 2015-01-01 00:00:00
  2. Der Monat wird als 13, 13/MONTHS_IN_A_YEAR = 1 interpretiert, also wird ein Jahr hinzugefügt und wir setzen den Monat auf 1 (13 Monate - 1 Jahr). Aktuell 2016-01-01 00:00:00
  3. Das Datum wird als 11 interpretiert. Dies ist richtig eingestellt. Aktuell 2016-01-11 00:00:00
  4. Die Stunde wird interpretiert 89, 89/HOURS_IN_A_DAY = 3, also werden 3 Tage hinzugefügt und wir setzen die Stunde auf 17 (89 Stunden - 3 Tage). Aktuell 2016-01-14 17:00:00
  5. Die Minute wird als 90, 90/MINUTES_IN_A_HOUR = 1 interpretiert, also wird 1 Stunde hinzugefügt und wir setzen die Minuten auf 30 (90 Minuten - 1 Stunde). Momentan 2016-01-14 18:30:00
  6. Die zweite wird als 90, 90/SECONDS_IN_A_MINUTE = 1 interpretiert, also wird 1 Minute hinzugefügt und wir setzen die Sekunden auf 30 (90 Sekunden - 1 Minute).

Dies lässt uns mit 2016-01-14 18:31:30.

Verwandte Themen