Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Das Problem ist ja nicht, dass das datum mit dem _ nicht als falsch markiert wurde, sondern das Programm bricht komplett ab mit einer Parseexception ja und warum bricht das Programm eigentlich nicht schon vorher ab bei der jahreszahl mit 6 buchstaben ???:L :?:
Jetzt passiert nüscht mehr obwohl ich 2 Fehler mind. drin habe einmal sollen nur Punkte erlaubt sein zwischen den Zahlen und zweitens muss das format dd.MM.yyyy sein sonst auch exception.
Hast du dich mal mit regülären Ausdrücken beschäftigt?
Wäre so eine Spontane idee von mir. Ich guck mal, dass ich morgen ein kleines Beispielprogramm dazu schreibe.
Einfach mal nach "reguläre ausrücke" und "java.util.regex" suchen findet man jede menge dazu.
Jedenfalls wäre das die IMHO einfachste Methode ein Datum zu überprüfen.
Mit regülären Ausdrücken sollte es auch möglich sein "_" zu "parsen / überprüfen.
neuester STand: nächstes mal sollte ich meine KOmmentare um den Block entfernen kein wunder ging nix :shock: :lol:
Code:
DateFormat formatter = new SimpleDateFormat("dd_MM_yyyy");
Date parseDate = formatter.parse(datetext);
schön und gut nur wird das jahr mit 10.10.199485 nicht geparsed, kein Problem sage ich da , wenn das Programm nur nicht aufhören würde in der for schleife weiterzulaufen... da die exception an die oberste Stelle der Methode weitergeht sprich beim methodenaufruf und dieser ist nun nicht mal in einer for schleife so wird das gar nicht funktionieren können, dass die komplette liste geprüft wird...weil immer vorher bei jedem fehler aus der for gehüpft wird....
schau mal orly: Pattern pippi = Pattern.compile("\\d{2}\\.\\d{2}\\.\\d{4}");
das würde zwar helfen mit dem format aber die höhe der zahlen könnte immer noch falsch sein z.B. das der Monat 42 tage hat... oder meinst du nachdem das format stimmt auf die Gültigkeit des Datums prüfen... ???
Man kann regüläre Ausdrücke so basteln, dass an gewisse stellen auch nur gewisse Zahlen hindürfen. #
Nachteil ist halt, dass du dich für ein Datumsformat entscheiden müsstest sprich du schreibst einen regülären Ausdruck für
das Format dd.mm.yy oder dd_mm_yy. Aber man kann mit regülären ausdrücken auf jedenfall nicht nur das Format ansich überprüfen, sondern auch, ob dieses Datum existent ist.
Ich werd nachher mal schauen, muss leider zur Schule jetzt.
Man kann regüläre Ausdrücke so basteln, dass an gewisse stellen auch nur gewisse Zahlen hindürfen. #
Nachteil ist halt, dass du dich für ein Datumsformat entscheiden müsstest sprich du schreibst einen regülären Ausdruck für
das Format dd.mm.yy oder dd_mm_yy. Aber man kann mit regülären ausdrücken auf jedenfall nicht nur das Format ansich überprüfen, sondern auch, ob dieses Datum existent ist.
Ich werd nachher mal schauen, muss leider zur Schule jetzt.
Year: For formatting, if the number of pattern letters is 2, the year is truncated to 2 digits; otherwise it is interpreted as a number.
Der nimmt dir sobald du 3x yyy hast, hinten einfach jede x beliebige Zahl! Da kannst unendlich hinmachen, würde er es als Jahr nehmen!
Ich würde zuerst mit regex prüfen ob es 4 stellig ist und falls ja dann mit SimpleDateFormat ob es ein gültiges Datum ist!
Btw, würde SimpleDateFormat beim Datum von 42.12.2007 auch nicht mekkern, da er daraus dann ein 11.01.2008 macht (erzählt die Tage einfach beim Dezember dazu).
Dazu müsstest du sagen, setLenient(false);
import java.util.regex.*;
public class regex {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("([0-2]?[0-9]|30|31)\\.([0-9]|10|11|12)\\.[0-9][0-9][0-9][0-9]");
Matcher matcher = pattern.matcher("31.11.2007");
System.out.print(matcher.matches());
}
}
hier ist der Reguläre Ausdruck für ein Datum mit dem format: tt.mm.yyyy.
Kurze Erklärung: mit z.B.[0-9] definierst du eine Zahlenmenge ( in dem fall von 0-9 ) also hab ich für die Tage die mengen [0-2]?[0-9]. Jetzt sagt man zwar: "Halt! Das geht doch dann nur bis 29!" Jo diese Menge schon, jedoch steht dahinter |30|31
Der reguläre Ausdruck ist so gewählt, dass auch Daten, wie etwa der 1.2.2007 akzeptiert werden, da Andwender ja durchaus zu Faul sein können 01.02.2007 zu schreiben.
Nun müsste das Programm nur noch abfangen, was man da eingegeben hat und dies als Integerwerte hinterlegen und prüfen, ob dieses Datum so existieren kann. Insbesondere muss man den Kram mit Schaltjahren etc. noch berücksichtigen, damit man wirklich sicher stellen kann, dass das eingegebene Datum auch wirklich faktisch existiert.
Year: For formatting, if the number of pattern letters is 2, the year is truncated to 2 digits; otherwise it is interpreted as a number.
Der nimmt dir sobald du 3x yyy hast, hinten einfach jede x beliebige Zahl! Da kannst unendlich hinmachen, würde er es als Jahr nehmen!
Ich würde zuerst mit regex prüfen ob es 4 stellig ist und falls ja dann mit SimpleDateFormat ob es ein gültiges Datum ist!
Btw, würde SimpleDateFormat beim Datum von 42.12.2007 auch nicht mekkern, da er daraus dann ein 11.01.2008 macht (erzählt die Tage einfach beim Dezember dazu).
Dazu müsstest du sagen, setLenient(false);
d.h. wenn mit regex alles ok ist meinst du das mit SimpleDAteFormat bei einem datum wie 42.12.2007 nicht moniert wird? ja für was brauche ich dann das SimpleDateFormat ?? regex check ob das format xx.xx.xxxx eingehalten wurde sprich 2.2.4. danach kann nur noch die höhe falsch sein wie 32.13.xxxx
also ist letztendlich das setLenient(true) dafür verantwortlich, dass ein datum auf die korrekte höhe der daten sprich 31 max bei monat geprüft wird.
Andere Sache wenn ich nun wieder Date Klassen benutze bekomme ich wie vorher eine iditotische Exception geworfen wenn das DAtum nicht stimmt mit ner Fehlermeldung das ist mal dumm...
Code:
String output;
SimpleDateFormat formatter;
Pattern pat = Pattern.compile("\\d{2}\\.\\d{2}\\.\\d{4}");
for(int i = 0 ; i < dm.getRowCount(); i++ )
{
String datum = (String) dm.getValueAt(i,2);
Matcher m = pat.matcher(datum);
boolean b = m.matches();
if(!b)
{
formatter = new SimpleDateFormat("dd.MM.yyyy, currentLocale"); // den 2. parameter verstehe ich net...
formatter.setLenient(true);
output = formatter.format(datum);
System.out.println("----------" + output + "----------");
colorRenderer.setCellColor(i,2, Color.YELLOW);
}
}
bei einem datum mit 22_10_2004 und 10.10.200202 wird gemeckert das passt ja schon mal vom regex her....
wenn ich nun den SimpleDateFormat code hinzufüge, bekomme ich eine FEhlermeldung:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Illegal pattern character 'c'
at java.text.SimpleDateFormat.compile(Unknown Source)
at java.text.SimpleDateFormat.initialize(Unknown Source)
at java.text.SimpleDateFormat.<init>(Unknown Source)
at java.text.SimpleDateFormat.<init>(Unknown Source)
at Checks.checkBirthDate(Checks.java:305)
at Checks.actionPerformed(Checks.java:542)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
import java.util.regex.*;
public class regex {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("([0-2]?[0-9]|30|31)\\.([0-9]|10|11|12)\\.[0-9][0-9][0-9][0-9]");
Matcher matcher = pattern.matcher("31.11.2007");
System.out.print(matcher.matches());
}
}
hier ist der Reguläre Ausdruck für ein Datum mit dem format: tt.mm.yyyy.
Kurze erklärung: mit z.B.[0-9] definierst du eine Zahlenmenge ( in dem fall von 0-9 ) also hab ich für die Tage die mengen [0-2]?[0-9]. Jetzt sagt man zwar: "Halt! Das geht doch dann nur bis 29!" Jo diese Menge schon, jedoch steht dahinter |30|31
Der reguläre Ausdruck ist so gewählt, dass auch Daten, wie etwa der 1.2.2007 akzeptiert werden, da Andwender ja durchaus zu Faul sein können 01.02.2007 zu schreiben.
Nun müsste das Programm nur noch abfangen, was man da eingegeben hat und dies als Integerwerte hinterlegen und prüfen, ob dieses Datum so existieren kann. Insbesondere muss man den Kram mit Schaltjahren etc. noch berücksichtigen, damit man wirklich sicher stellen kann, dass das eingegebene Datum auch wirklich faktisch existiert.
so habs zu spät gesehen darum antworte ich hier nochmals:
schaltjahre brauche ich net! Wenn es heißt 29.02.1980 dann nehme ich das als gültig an, da dies das geburtsdatum der Person ist, was ja stimmen muss es sei denn es ist ein zahlendreher und sollte 28.02.1980 heißen ist aber nicht mein Problem... falsche gelieferte daten die nicht zu einer Person gehören aber vom format richtig sind ist das Problem des daten Lieferanten nichts meines ;-)
1.2.2007 kann ich net durchgehen lassen , da alle personen mit xx.xx.XXXX angelegt werden. Sprich mein regex prüfte ja eh auf xx.xx.XXXX somit fallen die x.x.XXXX eh durch ;-)
jetzt habe ich dein pattern mal übernommen doch die daten mit 10.01.2000 meckert er wegen dem 01 bei 10.10.2000 meckert er nicht ??
1.2.2007 kann ich net durchgehen lassen , da alle personen mit xx.xx.XXXX angelegt werden. Sprich mein regex prüfte ja eh auf xx.xx.XXXX somit fallen die x.x.XXXX eh durch ;-)
Ich weiß ja nicht, wer dein Programm benutzen soll, aber einen Nutzer darauf festzulegen, in welcher Form er das Datum anzulegen hat, macht Arbeit. Erstens musst du dir eine Fehlermeldung einfallen lassen und der User muss, wenn er mal wieder in alte Gewohnheiten zurückgefallen ist das ganze noch einmal von vorne machen. Ich habe das anfangs auch durch den Regex gelöst und musste mir von Usern diese umständliche Bedienung ankreiden lassen. Besser ist es wirklich mit SimpleDateFormat. Mach es einfach wie folgt:
Code:
SimpleDateFormat sdfFormatted = new SimpleDateFormat("dd.MM.yyyy");
SimpleDateFormat sdfInput = new SimpleDateFormat("d.M.yy");
try
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.YEAR, -100);
sdfInput.set2DigitYearStart(cal.getTime());
String DateToSave = sdfFormatted.format(sdfInput.parse("Input"));
}
catch(ParseException pe)
{
// catch other date exception
}
Der Kalender sorgt dafür, dass zum Beispiel das Datum 1.1.95 nach der Formatierung als "01.01.1995" ausgegeben wird.
Ich hab den regulären Ausdruck eben aus diesem grund so gewählt.
Wie hugo sagte, der Anwender soll nicht auf ein bestimmtes Format festgelegt sein. Allerdings halte ich es für sinnvoll eine vierstellige Jahreszahl eingeben zu müssen, weil man dann auch das Jahrhundert genau bestimmen kann. Man stelle sich vor, eine Verwaltung digitalisiert alte Dokumente und gibt als jahr nur 89 ein. Ja was denn nun ? 1989 oder 1889 ( Ja Stadtverwaltungen haben oft noch solch alte Dokumente ).
Als Programmierer muss man immer mit dem DAU ( Dümmster Anzunehmender User ) rechnen. Und User kommen auf wirklich
dumme Gedanken. Also sollte man soviele Bedienungsfehler, wie möglich von vorneherein ausschließen.
Hi zusammen, ich bin momentan an einem ähnlichem problem, hoffentlich könnt ihr mir dabei helfen. Folgendes:
Ich habe ein TextFeld, in dem ich ein datum eingeben möchte, welches durch ein JButton bearbeitet und wieder in diesem TextFeld angezeigt werden soll.
Das Datum wird folgendermassen eingetippt: Bsp.: 01.01.08
Ich habe momentan das Problem das mir bei der Jahreszahl
einfach mit nullen aufgefüllt wird. folgendermassen wird es
im TextFeld nach Knopf druck ausgegeben: 01.01.0008.
Mein Kumpel meinte, das ich mir mal die methode 2DigitYearStart anschauen soll, jedoch finde ich nichts(in deutsch) im internet, was erläuterung und beispiele angeht.