Unerwartete Ergebnisse mit Javas DateFormat
Thomas am 16. Juni 2007 um 14:10Java stellt für das Parsen und Formatieren von Datumseingaben die Klasse java.text.DateFormat bereit.
Diese Klasse verwendet man in etwa so:
01 String date = "41.01.2007";
02 DateFormat df = DateFormat.getDateInstance(
DateFormat.MEDIUM,
Locale.GERMANY);
03 try {
04 Date d = df.parse(date);
05 System.out.println(df.format(d));
06 }
07 catch (ParseException ex) {
08 System.out.println("ungültiges Datum");
09 }
Jeder kann auf den ersten Blick sehen, dass der 41.01.2007 ein ungültiges Datum ist. Man möchte meinen, dass der Aufruf in Zeile 04 zu einer Exception führen muss. Falsch gedacht. Tatsächlich werden die “Überschüssigen” Tage und Monate einfach zum Datum dazuaddiert. Aus dem 41.01.2007 wird so der 10.02.2007 und aus dem 4235.18.1900 wird folgerichtig der 03.01.1913.
Dieses Verhalten mag zwar in manchen Situationen recht praktisch sein, spätestens bei der Validierung von Benutzereingaben sieht die Sache anders aus. Wenn ein Benutzer ein solches ungültiges Datum eingibt, war es wahrscheinlich ein Tippfehler.
Schuld an dem Schlamassel ist der nachsichtige (engl.: lenient) Parser in DateFormat. Diese Nachsichtigkeit kann man dem Parser glücklicherweise austreiben, indem man die Methode setLenient(boolean lenient) mit dem Paramter false aufruft.
Und so funktioniert das Programm, wie erwartet:
01 String date = "41.01.2007";
02 DateFormat df = DateFormat.getDateInstance(
DateFormat.MEDIUM,
Locale.GERMANY);
03 df.setLenient(false);
04 try {
05 Date d = df.parse(date);
06 System.out.println(df.format(d));
07 }
08 catch (ParseException ex) {
09 System.out.println("ungültiges Datum");
10 }
Warum der Parser standardmäßig den nachsichtiges Parser verwendet bleibt offen.