2015-07-30 5 views
9

Ho un codice java, che immette la data in un formato specifico.Perché SimpleDateFormat.parse accetta una stringa di data non valida?

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; 
    } 

Ora sto entrando 2015-13-11 89:90:90 che è una data non valida. Ma restituisce Thu Jan 14 18:31:30 IST 2016 come data. Perché è così? Come faccio a rendere nulla come data?

+0

Okay, mi sono perso che stavi inserendo un errore di proposito;) – DigitalNinja

risposta

14

Da uno sguardo del javadocs, sembra essere utilizzando una modalità lenient di analisi in cui si accetta mal formattato in ingresso:

L'aggiunta di questa linea

format.setLenient(false); 

dopo l'inizializzazione del vostro oggetto DateFormat sembra aggiustarlo

+0

Questo aiuta, grazie. – inquisitive

4

Cercherò di spiegare perché sta accadendo.

La data è diversa perché i valori che superano il massimo dei loro campi vengono arrotolati nel campo successivo più grande.

Non sono sicuro che l'ordine in cui esso è stato risolto, ma qui è ciò che accade in generale:

Dato 2015-13-11 89:90:90

  1. L'anno viene interpretato come 2015, che è impostato correttamente. Attualmente 2015-01-01 00:00:00
  2. Il mese viene interpretato come 13, 13/MONTHS_IN_A_YEAR = 1, quindi viene aggiunto un anno e il mese viene impostato su 1 (13 mesi - 1 anno). Attualmente 2016-01-01 00:00:00
  3. La data viene interpretata come 11. Questo è impostato correttamente. Attualmente 2016-01-11 00:00:00
  4. L'ora viene interpretata 89, 89/HOURS_IN_A_DAY = 3, quindi vengono aggiunti 3 giorni e impostiamo l'ora su 17 (89 ore - 3 giorni). Attualmente 2016-01-14 17:00:00
  5. Il minuto viene interpretato come 90, 90/MINUTES_IN_A_HOUR = 1, quindi viene aggiunta 1 ora e vengono impostati i minuti su 30 (90 minuti - 1 ora). Attualmente 2016-01-14 18:30:00
  6. Il secondo viene interpretato come 90, 90/SECONDS_IN_A_MINUTE = 1, quindi viene aggiunto 1 minuto e vengono impostati i secondi su 30 (90 secondi - 1 minuto).

Questo ci lascia con 2016-01-14 18:31:30.