Datumsvalidierung funktioniert nicht!

Hallo,
ich möchte bei mir ein Datumsvalidierer bauen. Leider funktioniert
das nicht, denn bei den letzten 2 Ziffern im Jahr kann man
beliebige Buchstaben einsetzten. Wo ist mein Fehler?

(Das ergebnis des Codes unten ist TRUE!)

public static void main(String[] args) {
try {
System.out.println("Str2Date: " + stringToDate(„01/01/20AA“));
} catch (ParseException e) {
e.printStackTrace();
}
}

public static final Date stringToDate(String date) throws ParseException{

final SimpleDateFormat DATEFORMATTER = new SimpleDateFormat(„dd’/‚MM‘/'yyyy“);
DATEFORMATTER.setLenient(false);
return DATEFORMATTER.parse(date);
}

Hallo,

bei den letzten 2 Ziffern im Jahr kann man
beliebige Buchstaben einsetzten. Wo ist mein Fehler?


stringToDate(„01/01/20AA“));

public static final Date stringToDate(String date) throws
ParseException
{
final SimpleDateFormat DATEFORMATTER = new
SimpleDateFormat(„dd’/‚MM‘/'yyyy“);
DATEFORMATTER.setLenient(false);
return DATEFORMATTER.parse(date);
}

Siehe Doku zu DateFormat.parse(String source) http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html#parse(java.lang.String)

„Parses text from the beginning of the given string to produce a date. The method may not use the entire text of the given string.

Die Methode verarbeitet soviel von dem übergebenen String, wie sie kann, mitt AA kann sie nix anfangen, deshalt kommt im Ergebnis auch das Jahr 20 heraus. (In Millisekunden: -61536243600000). Du könntest ja tatsächlich das Jahr 20 meinen. Wenn der Jahresteil ganz fehlt wird die Exception geworfen.

gruß
Heavy

Hallo,
Danke für den Hinweis, aber bei allem nötigen Respekt, das
ist für mich ein „bug“! denn wenn ich explizit angebe,
dass ich dieses Datumsformat erwarte „dd/MM/yyyy“, dann auch
bitte ohne wenn und aber! Das ist nie ein gültiges Datumsformat:
„01/01/20CC“. Kein Wunder, dass die millionenschwere Raketen
Abstürzen, wenn man sich auf sowas verlässt :wink:
Naja, nun parse ich explizit das Jahr raus und mache eine
integer-prüfung…ist aber wirklich lächerlich!

Und zu Deiner Frage, wie man das Jahr 20 schreibt: 0020 (wie das Format dies angibt) :smile:
Danke,
Fabian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Nein, ist kein Bug.
Moin

Danke für den Hinweis, aber bei allem nötigen Respekt, das
ist für mich ein „bug“!

Nein. Und mit allem nötigen Respekt: Wer lesen kann ist also malwieder klar im Vorteil:

Zitat SimpleDateFormater-doc:
For parsing, if the number of pattern letters is more than 2, the year is interpreted literally, regardless of the number of digits. So using the pattern „MM/dd/yyyy“, „01/11/12“ parses to Jan 11, 12 A.D.

Kein Wunder, dass die millionenschwere Raketen
Abstürzen, wenn man sich auf sowas verlässt :wink:

? Die Ariane5 hatte doch gar kein java im OnBoard-Code ?

cu

Hallo,
Danke für den Hinweis, aber bei allem nötigen Respekt, das
ist für mich ein „bug“! denn wenn ich explizit angebe,
dass ich dieses Datumsformat erwarte „dd/MM/yyyy“, dann auch

Lies dir bitte die API Doku dazu durch.

http://java.sun.com/j2se/1.4.2/docs/api/java/text/Si…

Java ignoriert die letzten Zeichen, da er sie nicht interpretieren kann.

bitte ohne wenn und aber! Das ist nie ein gültiges
Datumsformat:
„01/01/20CC“. Kein Wunder, dass die millionenschwere Raketen

Ein Bug waere es wohl, wenn sowas wie „01/01/GG“ gehen wuerde.

Abstürzen, wenn man sich auf sowas verlässt :wink:
Naja, nun parse ich explizit das Jahr raus und mache eine
integer-prüfung…ist aber wirklich lächerlich!

Noch umstaendlicher waere es, wenn du die letzten vier Zeichen
mit Character.isDigit(char) pruefst. :wink:

Du kannst dir auch mal den Quellcode von Sun anschauen.
(SimpleDateFormat.parse(…) -> subParse(…))
Wenn das Year-Pattern >2 ist, dann wird das direkt in den
Calendar geschrieben (cal.set(…)). Sieht also so aus,
als ob der die Zeichen ignoriert.

Gruss, Patrick

Nein. Und mit allem nötigen Respekt: Wer lesen kann ist also
malwieder klar im Vorteil:

Zitat SimpleDateFormater-doc:
For parsing, if the number of pattern letters is more than
2, the year is interpreted literally, regardless of the number
of digits. So using the pattern „MM/dd/yyyy“, „01/11/12“
parses to Jan 11, 12 A.D.

Da gebe ich Dir recht. Wenn ich das gelesen hätte, hätte ich
es gewusst, aber ehrlich, Du würdest Dich auch wundern, wenn
Du eine methode aufrufst, die heisst „isDate(Date)“ und etweder
ein boolisches true oder false jedoch einen String zrückbekommst, wo drin „true“ oder „false“ drin steht.
Manchmal setzt man ohne ellenlange Dokus zu lesen, etwas voraus…
was eben tückisch sein kann :smile:

Wenn ich EXPLIZIT ein Format angebe, was ein Datum darstellen soll
und zwar im Jahr eine 4 stellige ZAHL, dann erwarte ich die
Eingabe auch dementsprechend.
Intern ist es mir egal, wie Java damit umgeht.
„22/01/20XY“ ist nunmal kein richtiges Datumsformat!

Gruss,
Fabian

Kein Wunder, dass die millionenschwere Raketen
Abstürzen, wenn man sich auf sowas verlässt :wink:

? Die Ariane5 hatte doch gar kein java im OnBoard-Code ?

cu