2015-07-27 29 views
5

Provo ad utilizzare questa funzione ma non funziona con questo caso '12/05/201a 'qualcuno sa perché succede questo?SimpleDateFormat non funziona come previsto

Nel mio test uso questo System.out.println(isThisDateValid("12/05/201a", "dd/MM/yyyy")); e la risposta era true ma mi aspetto che il risultato sia falso perché l'anno contiene lettere.

public static boolean isThisDateValid(String dateToValidate, String dateFromat) 
    { 

     if (dateToValidate == null) 
     { 
      return false; 
     } 

     SimpleDateFormat sdf = new SimpleDateFormat(dateFromat); 
     sdf.setLenient(false); 

     try 
     { 

      //if not valid, it will throw ParseException 
      Date date = sdf.parse(dateToValidate); 
      System.out.println(date); 

     } catch (ParseException e) 
     { 

      e.printStackTrace(); 
      return false; 
     } 

     return true; 
    } 
+0

prende "201" per "anno". Se metti tutte le lettere al posto dell'anno, non verrà analizzato. Dal momento che si aspetta la cifra '1' al posto di' year'. – Satya

+0

Si aspetta almeno una singola cifra al posto di "anno". – Satya

+0

@Reimeus: 'SimpleDateFormat' non * ignora * lettere, semplicemente non consuma l'intera stringa. Ecco un esempio di ciò non ignorando le lettere: http://ideone.com/gnbTwy –

risposta

12

DateFormat#parse non significa necessariamente utilizzare l'intera stringa:

analizza il testo a partire dall'inizio della stringa data per la produzione di una data. Il metodo non può utilizzare l'intero testo della stringa specificata.

(corsivo mio)

SimpleDateFormat's docs ci dicono che yyyy non significa necessariamente che esso richiederà quattro cifre per un anno:

Anno:

..

  • Per l'analisi, se il numero di lettere del modello è superiore a 2, l'anno viene interpretato letteralmente, indipendentemente dal numero di cifre. Quindi, utilizzando il modello "MM/dd/yyyy", "01/11/12" analizza a 11-gen-12 dC

Quindi è corretto (se forse sorprendente) che analizza la stringa nell'anno 201.

È possibile utilizzare parse(String,ParsePosition) alla figura se l'intera stringa è stata consumata o convalidata con un'espressione regolare prima dell'analisi. Ecco una versione che controllerà che l'intera stringa sia stata analizzata, e non solo i primi caratteri:

public static boolean isThisDateValid(String dateToValidate, String dateFormat) { 
    if (dateToValidate == null) { 
     return false; 
    } 

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    sdf.setLenient(false); 

    ParsePosition position = new ParsePosition(0); 
    Date date = sdf.parse(dateToValidate, position); 
    return date != null && position.getIndex() == dateToValidate.length(); 
}