PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datum parsen in Java


Evalley
2006-01-17, 19:14:01
Ich hab hier ein kleines Problem in Java. Ich möchte eine Eingabe auf ihre Gültigkeit prüfen.Die Eingabe soll von der Form tt.mm.yyyy sein und natürlich nur Ziffern enthalten. Ich hatte versucht die Eingabe zu überprüfen, indem ich die Eingabe über das DateFormat parse. Also folgendermaßen:

public boolean valid(String s)throws ParseException{
Date datum;

DateFormat DF = DateFormat.getDateInstance();
DF.setLenient(false);
try{
datum = DF.parse(s);
}catch(ParseException e){
return false;

}
return true;

}



Da tut sich jetzt nur ein Problem auf. Wenn die Eingabe von der Form tt.m.yyyy ist, kommt trotzdem true. Im Prinzip stimmts ja auch, weil es sich ja bei z.B. 17.1.2006 um kein falsches Datum handelt. Leider muss die Eingabe aber von der Form tt.mm.yyyy sein. Ich hoffe ihr versteht mein Problem!?
Wie kann ich es anrichten, dass er wirklich genau auf die vorgegebene Form prüft??

Coda
2006-01-17, 19:46:02
Gibts keine Regular Expressions in Java?

Evalley
2006-01-17, 19:56:04
Mmh, ja die gibts auch soweit ich weiß. Es gibt auch speziell für Daten eine Möglichkeit vorher das Format über einen String festzulegen mittels SimpleDateFormat. Aber es hat mich noch nicht zum gewünschten Erfolg geführt.

Coda
2006-01-17, 20:00:15
Dann nimm einfach ne Regexp. "[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9][0-9]" müsste es tun (keine Funktionsgarantie).

Senior Sanchez
2006-01-17, 20:22:14
Dann nimm einfach ne Regexp. "[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9][0-9]" müsste es tun (keine Funktionsgarantie).

Naja, zumindest die zehner-Stellen von Tag und Datum könnte man ja etwas eingrenzen ;)

Evalley
2006-01-17, 20:39:09
Könnt ihr mir kurz zeigen wie ich das implementiere?? Den Ausdruck von euch will er nicht annehmen. Vielleicht mach ich was falsch. Hab noch nicht so viel in Java gemacht mit Regexps.

Trap
2006-01-17, 20:42:21
Man sollte aber sowohl die Regexp als auch das per DateFormat parsen testen, die Regexp allein ist zu unscharf.

Senior Sanchez
2006-01-17, 20:55:09
Man sollte aber sowohl die Regexp als auch das per DateFormat parsen testen, die Regexp allein ist zu unscharf.

Wieso unscharf?!?
Wir haben doch heute den 99.99.9999 oder?!

Coda
2006-01-17, 21:02:29
Naja, zumindest die zehner-Stellen von Tag und Datum könnte man ja etwas eingrenzen ;)Ja, hast recht, das hab ich übersehen.

Senior Sanchez
2006-01-17, 21:15:57
Ja, hast recht, das hab ich übersehen.

koin problem. Aber per regex das ganze zu machen in kombination mit nem DateFormat ist doch schon ne gute Idee.

Warum bietet der GregorianCalendar eigentlich keine Validierungsmethode?

Abnaxos
2006-01-17, 21:44:15
Warum bietet der GregorianCalendar eigentlich keine Validierungsmethode?

Bietet er doch (bzw. das DateFormat), das Ding ist sogar recht schlau, indem es problemlos aus einem 29.02.2001 einen 01.03.2001 macht. Das schaltest du mit setLenient(false) aus. Dass er fehlende Nullen ignorieren wird, halte ich auch eher für ein Feature als für einen Bug, gerade hier sehe nicht ganz ein, warum du das verhindern willst. Aber egal, du wirst deine Gründe haben, und hierzu bietet sich die Kombination von Regex für die Form und dann parsen via DateFormat tatsächlich an.

/Edit: Sorry, ich habe zu spät realisiert, dass ich gar nicht auf den OP antworte. ;)

PatkIllA
2006-01-17, 22:06:18
Es wäre ja auch kein Problem mit dem SimpleDateFormatter (http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html) und dem geparsten Datum aus der Eingabe sich das passende Format inklusiver führender Nullen zu machen.

Evalley
2006-01-17, 22:55:56
Es wäre ja auch kein Problem mit dem SimpleDateFormatter (http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html) und dem geparsten Datum aus der Eingabe sich das passende Format inklusiver führender Nullen zu machen.

Naja, Ziel soll ja nicht sein die Eingabe in ein bestimmtes Format zu bringen sondern die Eingabe zu validieren. Meine Idee war halt zu versuchen die Eingabe iin ein bestimmtes Datumsformat zu parsen und bei nichtgelingen false zurück zu geben. Mit SimpleDateFormat bekomm ich das Problem mit der führenden Null aber leider nicht in den Griff. Mit Regexps in Java hab ich noch nichts gemacht. Wie kombiniere ich die mit dem DateFormat?? Kann mir da jemand weiterhelfen? Danke!

EgonOlsen
2006-01-17, 23:41:42
Wie wär das?:

public boolean valid(String s) throws ParseException {
DateFormat DF = DateFormat.getDateInstance();
DF.setLenient(false);
try {
Date datum = DF.parse(s);
String sd=new SimpleDateFormat("dd.MM.yyyy").format(datum);
if (!sd.equals(s)) {
return false;
}
}
catch (ParseException e) {
return false;
}
return true;
}

Monger
2006-01-18, 09:04:55
Wie wär das?:


Der Gedanke ist nicht doof, aber es ist ja wohl so, dass das SimpleDateFormat GRUNDSÄTZLICH die Nullen abschneidet. Damit wüsste man zwar, das was schief gelaufen ist, könnte es aber nicht beheben.


@topic: muss denn der Benutzer wirklich zwingend führende Nullen angeben? Ich kann mir keinen Grund vorstellen weshalb man das tun sollte, außer Sadismus. Eigentlich ist es doch gut, wenn der Benutzer eingeben kann was er will.

Wenn ich sowas machen müsste, hätte ich wahrscheinlich einen StringTokenizer genommen, und mir jedes Schnipsel einzeln angeschaut. Wenn du einen so speziellen Fall hast, bastelst du dir vielleicht wirklich besser selbst ein Datumsformat. Du kannst es ja noch immer mit dem SimpleDateFormat bei Bedarf gegen checken lassen, musst es aber nicht zwingend in dem selben Format halten.


Bei den regulären Ausdrücken sträuben sich mir zumindest ein bißchen die Haare. Ich sehe keinen Sinn darin, die Zeitrechnung neu zu erfinden - egal mit welchen Mitteln.

EgonOlsen
2006-01-18, 10:17:43
Der Gedanke ist nicht doof, aber es ist ja wohl so, dass das SimpleDateFormat GRUNDSÄTZLICH die Nullen abschneidet. Damit wüsste man zwar, das was schief gelaufen ist, könnte es aber nicht beheben.
Hmm..verstehe nicht ganz, was du meinst. Wenn du 01.01.2005 übergibst, macht die Datumskonvertierung daraus quasi 1.1.2005 und das SimpleDateFormat wieder 01.01.2005. Das mit der Eingabe vergleichen und man sieht, ob es passt oder nicht. Er will die Eingabe ja nicht korrigieren, sondern nur als "falsch" erkennen, sofern ich das richtig verstanden habe.

Monger
2006-01-18, 11:14:37
Hmm..verstehe nicht ganz, was du meinst. Wenn du 01.01.2005 übergibst, macht die Datumskonvertierung daraus quasi 1.1.2005 und das SimpleDateFormat wieder 01.01.2005. Das mit der Eingabe vergleichen und man sieht, ob es passt oder nicht. Er will die Eingabe ja nicht korrigieren, sondern nur als "falsch" erkennen, sofern ich das richtig verstanden habe.

Aso. Ok, sorry. War gestern geistig nicht mehr ganz so fit! :D

Evalley
2006-01-18, 15:04:13
Hmm..verstehe nicht ganz, was du meinst. Wenn du 01.01.2005 übergibst, macht die Datumskonvertierung daraus quasi 1.1.2005 und das SimpleDateFormat wieder 01.01.2005. Das mit der Eingabe vergleichen und man sieht, ob es passt oder nicht. Er will die Eingabe ja nicht korrigieren, sondern nur als "falsch" erkennen, sofern ich das richtig verstanden habe.

Genau! Besten Dank für die Hilfe!