2015-08-22 8 views
5

Kann mir jemand erklären, wie man die folgende Methode erhält, um einen Wert von false für den angezeigten Eingang zurückzugeben? Es gibt true, was ich nicht erwarte.Warum wird ein ungültiges Datum erfolgreich als echtes Datum analysiert?

isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm") 

ich denke, das false zurückgeben sollte, aber anscheinend Java so nicht denken. Die aktuelle Datumszeichenfolge enthält diese zusätzlichen Zeichen am Ende: ", 21:00".

public static boolean isDateValid(String date, String dateFormat) 
{ 
     try { 
      DateFormat df = new SimpleDateFormat(dateFormat); 
      df.setLenient(false); 
      Date newDate = df.parse(date); 
      System.out.println("Date value after checking for validity: " + newDate); 
      return true; 
     } catch (ParseException e) { 
      return false; 
     } 
} 

Antwort

7

parse nicht unbedingt die gesamte String verwenden. Das ist sehr klar in the Javadoc, Hervorhebung von mir:

parse

public Date parse(String source) throws ParseException

Analysiert Text von Anfang an der gegebene Zeichenfolge ein Datum zu erzeugen. Die Methode kann nicht den gesamten Text der angegebenen Zeichenfolge verwenden. Weitere Informationen zur Datumsanalyse finden Sie in der Methode parse(String, ParsePosition).


können Sie erkennen, ob es durch die Verwendung parse(String text, ParsePosition pos) am Ende des Strings zusätzliche Zeichen sind. Wenn pos nicht gleich dem Ende des Strings ist, dann waren am Ende noch weitere Zeichen übrig.

Hier ist ein Arbeitsprogramm mit einem Prüfstand, der dies genau so überprüft, wie Sie es beabsichtigen. In diesem Programm wird pos.getIndex()0 sein, wenn es überhaupt nicht analysieren kann, eine Zahl, die zu klein ist, wenn es zusätzliche Zeichen am Ende sind, und gleich, ob es so funktioniert, wollen Sie

public class DateFormatTest { 
    public static void main(String[] args) { 
    // should be false 
    System.out.println(isDateValid("19/06/2012 5:00, 21:00", "dd/MM/yyyy HH:mm")); 
    System.out.println(isDateValid("19/06/201", "dd/MM/yyyy HH:mm")); 

    System.out.println(); 

    // should be true 
    System.out.println(isDateValid("19/06/2012 5:00", "dd/MM/yyyy HH:mm")); 
    } 

    public static boolean isDateValid(String date, String dateFormat) { 
    ParsePosition pos = new ParsePosition(0); 
    DateFormat df = new SimpleDateFormat(dateFormat); 
    df.setLenient(false); 
    df.parse(date, pos); 

    return pos.getIndex() == date.length(); 
    } 
}