Prüfen, ob Datum gültig

Status
Nicht offen für weitere Antworten.
W

winter2

Gast
Weiß jemand, wie man überprüfen kann, ob ein Datum, das in einem String vorliegt, einen gültigen Datumswert darstellt? Also insbesondere, daß Buchstaben als fehlerhaft erkannt werden, und auch nicht existente Daten wie "31.02.1998".
Auch solche wie "28.12.2003gg".
Sowas kann ich nicht in eine Datenbank schreiben....

Ich hatte das Thema vor Monaten hier schon, aber die gefundene Antwort taugt nicht, genausowenig wie alle anderen Lösungen im Archiv. Das folgende Beispiel:
Code:
try {
      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd.MM.yyyy");
      java.util.Date d = sdf.parse(gebDat.getText());
} catch (java.text.ParseException pe) {
      // nicht gültiges Datum!
}

erkennt z.B. folgenden String als korrekt: "31.12.197p" als 31.12.197
oder "0.07.1997" als 30.06.1997
 

DP

Top Contributor
was für ein feldformat hat dein feld in der db? wenn du müll reinschiebst, wirft deine datenbank eine exception...
 

abollm

Top Contributor
Aus dem aktuellen Kalender-Thread und angepasst an dein Problem folgender, relativ simpler Code dazu:

Code:
   ...
   protected static SimpleDateFormat dateFormat = new SimpleDateFormat(
         "dd.MM.yyyy");

   ...
    // Datum-String
   String s = "01.02.2001";
      try {
         Date theDate = dateFormat.parse(s);
         System.out.println("Datumstring gewandelt: "
               + dateFormat.format(theDate));
      } catch (ParseException pe) {
         System.out.println("Eingegebenes Datum (" + s
               + ") entspricht nicht Format \"dd.MM.yyyy\"");
      }
   }
   ...

Man kann das natürlich noch nach Belieben verfeinern.
 
W

winter2

Gast
...und wo ist der Unterschied zu meiner Methode, die schon nicht richtig funktioniert?
Die Datenbankverbindung bringt einen Fehler, genau, aber das will ich natürlich vermeiden und möglichst vorher schon abfangen, und dann eine entsprechende Meldung über das ungültige Datumsformat ausgeben.
 

abollm

Top Contributor
winter2 hat gesagt.:
...und wo ist der Unterschied zu meiner Methode, die schon nicht richtig funktioniert?
Die Datenbankverbindung bringt einen Fehler, genau, aber das will ich natürlich vermeiden und möglichst vorher schon abfangen, und dann eine entsprechende Meldung über das ungültige Datumsformat ausgeben.

Wird bei den von dir genannten (falschen) Beispielen denn keine Exception geworfen?
 

Bleiglanz

Gesperrter Benutzer
wie wärs mit einem PreparedStatement und der Methode setDate?

dann nimmt dir der JDBC Treiber wenigstens schon mal die Konvertierung java.util.Date -> Datenbank ab?
 

abollm

Top Contributor
EInmal unabhängig von Bleiglanz' Hinweis folgender Beispiel-Code, mit dem du vor einer Übergabe an die DB prüfen kannst, ob das Datum korrekt ist.

Zunächst die Klasse:
Code:
import java.util.*;

/**
 * Prüft auf gültiges Datum
 */
public class DateValidate {

	public static String stok = ".";
	/**
	 * Hier wird eine (deutsche) Datumsangabe (dd.MM.yyyy)
	 * auf Gültigkeit geprüft.
	 * Muss noch ergänzt werden, um z.B. die einzelnen
	 * Monatstage 30./31. zu überprüfen.
	 * 
	 * @param String date
	 * @return liefert "true" falls Datum gültig
	 */
	public boolean dateValidate(String date) throws Exception {

		boolean valid = true;
		int c = 1;
		int sd = 0, sm = 0, sy = 0;

		System.out.println("DV - Datum: " + date);
		StringTokenizer st = new StringTokenizer(date, stok);

		while (st.hasMoreTokens()) {
			if (c == 1) {
				sd = Integer.valueOf(st.nextToken()).intValue();
				//System.out.println("String Tag: " + sd);
			}
			if (c == 2) {
				sm = Integer.valueOf(st.nextToken()).intValue();
				//System.out.println("String Monat: " + sm);
			}
			if (c == 3) {
				sy = Integer.valueOf(st.nextToken()).intValue();
				//System.out.println("String Jahr: " + sy);
				String year = String.valueOf(sy);
				int length = year.length();
				//System.out.println("Länge: " + length);
				if (length != 4) {
					valid = false;
				}
			}
			if (c >= 4) {
				//System.out.println("Zähler c >= 4");
				valid = false;
				break;
			}
			c++;
		}
		if (valid == true) {
			try {
				//Schaltjahr
				if ((((sy % 4) == 0) && ((sy % 100) != 0) || ((sy % 400) == 0))) {
					//System.out.println("Schaltjahr");
					//Februar
					if (sm == 2) {
						//Kein gültiger Tag
						if (!(sd >= 1 && sd <= 29)) {
							valid = false;
						} else
							valid = true;
					}
				}
				//Kein Schaltjahr
				else {
					//System.out.println("kein Schaltjahr");
					//Februar
					if (sm == 2) {
                    //Kein gültiger Tag
						if (!(sd >= 1 && sd <= 28)) {
							valid = false;
						} else
							valid = true;
					}
				}
			    if (sd < 1 || sd > 31)
			    	valid = false;
			    if (sm < 1 || sm > 12)
			    	valid = false;
			} catch (Exception ee) {
				ee.printStackTrace();
			}

		}
		System.out.println("Gültigkeit: " + valid);
		return valid;
	}
}
Jetzt ein wenig Code zum Aufruf:
Code:
...
	protected static SimpleDateFormat dateFormat = new SimpleDateFormat(
			"dd.MM.yyyy");

	public static DateValidate dval = new DateValidate();

...
		// Datum-String 1 richtig!
		String s = "31.12.1998";
		try {
			Date theDate = dateFormat.parse(s);
			dateFormat.setLenient(false);

			System.out.println("Datumstring gewandelt: "
					+ dateFormat.format(theDate));
		} catch (ParseException pe) {
			System.out.println("Eingegebenes Datum (" + s
					+ ") entspricht nicht Format \"dd.MM.yyyy\"");
		}
		// Datum-String 2 falsch!
		s = "31.02.1998";
		try {
			if (dval.dateValidate(s) == false)
				System.out.println("Der Datumstring ist _nicht_ gültig!");
		} catch (Exception e) {
			System.out.println("Exception: " + e);
			//e.printStackTrace();
		}
		// Datum-String 3 falsch!
		s = "32.07.1997";
		try {
			if (dval.dateValidate(s) == false)
				System.out.println("Der Datumstring ist _nicht_ gültig!");
		} catch (Exception e) {
			System.out.println("Exception: " + e);
			//e.printStackTrace();
		}
		// Datum-String 4 falsch!
		s = "31.12.197";
		try {
			if (dval.dateValidate(s) == false)
				System.out.println("Der Datumstring ist _nicht_ gültig!");
		} catch (Exception e) {
			System.out.println("Exception: " + e);
			//e.printStackTrace();
		}
		

	}
...
 

schmeckzilla

Mitglied
Was spricht denn gegen Dateformat? Wenn man setLenient auf False setzt, dann validiert er auch ob es sich dabei um ein existierendes Datum handelt. So wird zum Beispiel der 30.02.2002 eine Exception werfen.

Ob es sich vorher, um genau die richtige Form handelt, würde ich mit einem regulären Ausdruck überprüfen.

Code:
 public boolean checkID ( String id ) {
        DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
        df.setLenient( false );
        try {
          Date d1 = df.parse(id);
          return true;
        } catch ( ParseException e ) {
            // nichts wenn falsch!
        }
        
        return false;
    }

@abollm
Wieso zerlegst Du den String den Selbst in einzelne Stücke und nutzt nicht nur das DateFormat.parse(String)? Was ist der Vorteil, wenn man selbst alles testet? Oder andersrum, worin liegt der Nachteil nur DateFormat zu verwenden?
 

schmeckzilla

Mitglied
Hab jetzt noch mal getestet, wie fehlertolerant Date und DateFormat sind.

Erst der Quelltext:
Code:
import java.util.*;
import java.text.*;

public class DateValidationTestDrive {
    
    public static void main (String[] args) {
        String[] testDates = { "31.02.1998", "28.12.2003gg", "0.07.1997", "31.12.197p",
        "21.02.2004", "12.22.2001", "29.02.04", "35.01.2001" };
        for (String testDate : testDates ) {
            DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
            df.setLenient( false );
            System.out.print("Teste Datum: " + testDate + "...");
            try {
                // Fr Database soll gibt es java.sql.Date, dass
                // overrides java.util.Date und behandelt nur Datum
                // ohne Uhrzeiten, hab ich aber nicht getestet.
                Date d1 = df.parse(testDate);
                String okDate = df.format(d1);
                System.out.println("ok ==> Datumswert ist " + okDate);
            } catch ( ParseException e ) {
                System.out.println("nicht ok!!!");
            }    
        }    
    }
 }

Jetzt der Output:
Teste Datum: 31.02.1998...nicht ok!!!
Teste Datum: 28.12.2003gg...ok ==> Datumswert ist 28.12.2003
Teste Datum: 0.07.1997...nicht ok!!!
Teste Datum: 31.12.197p...ok ==> Datumswert ist 31.12.0197
Teste Datum: 21.02.2004...ok ==> Datumswert ist 21.02.2004
Teste Datum: 12.22.2001...nicht ok!!!
Teste Datum: 29.02.04...ok ==> Datumswert ist 29.02.0004
Teste Datum: 35.01.2001...nicht ok!!!

Also ein paar Deiner Fälle würde er abfangen. Aber leider nicht alle. Da es bei Datenbanken aber meistens auf den Inhalt ankommt, würde ich es da schon genau versuchen. ;-)

Also erst Länge testen,
if ( testDate.length() != 10 )
dann mit einem regulären Ausdruck den String auf die Form ZZ.ZZ.ZZZZ überprüfen (Z steht hier für Ziffer),
Pattern p = Pattern.compile("\\d{2}\\.\\d{2}\\.\\d{4}");
und danach das ganze dann mit Date und DateFormat.

Schon fertig. :)
 

schmeckzilla

Mitglied
Komplett sieht das ganze dann so aus. Kann man sicherlich schöner schreiben, ist aber nur der erste schnelle Entwurf.

Code:
import java.util.*;
import java.util.regex.*;
import java.text.*;

public class DateValidationTestDrive {
    
    public static void main (String[] args) {
        String[] testDates = { "31.02.1998", "28.12.2003gg", "0.07.1997", "31.12.197p",
        "21.02.2004", "12.22.2001", "29.02.04", "35.01.2001", "WW.11.1234" };
        for (String testDate : testDates ) {
            System.out.print("Teste Datum: " + testDate + "...");
            
            // Länge überprfen
            if ( testDate.length() != 10 ) {
                System.out.println("Nicht 10 Zeichen lang!");
                continue;
            }
            
            // String überprfen, ob "ZZ.ZZ.ZZZZ"  (Z = Ziffer)
            Pattern p = Pattern.compile("\\d{2}\\.\\d{2}\\.\\d{4}");
            Matcher m = p.matcher(testDate);
            if ( m.find() ) {
                ; // empty Statement
            } else {
                System.out.println("Entspricht nicht dem RegEx");
                continue;
            }
            
            DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
            df.setLenient( false );
            
            try {
                // Für Database gibt es java.sql.Date, dass
                // overrides java.util.Date und behandelt nur Datum
                // ohne Uhrzeiten, hab ich aber nicht getestet.
                Date d1 = df.parse(testDate);
                String okDate = df.format(d1);
                System.out.println("ok ==> Datumswert ist " + okDate);
            } catch ( ParseException e ) {
                System.out.println("nicht ok!!!");
            }    
        }    
    }
   
}

Am besten als eigene Methode anpassen und mit dem entsprechenden Rückgabewert. In einer ernsthaften Anwendung würde ich das Datum als Stringwert zurückgeben und selbst Exception werfen, falls das Datum fehlerhaft ist.
1. Exceptionart: String zu kurz.
2. Exceptionart: Formatfehler
3. Exceptionart: ungültiges Datum

So kannst Du das ganze dann sauber in Deiner App catchen.
 

abollm

Top Contributor
@abollm
Wieso zerlegst Du den String den Selbst in einzelne Stücke und nutzt nicht nur das DateFormat.parse(String)? Was ist der Vorteil, wenn man selbst alles testet? Oder andersrum, worin liegt der Nachteil nur DateFormat zu verwenden?

Weil ich so auch rel. einfach i. Numberformat- als auch ii. (einfache) Format-Verletzungen feststellen kann. Alle aufgelisteten Fehleingaben habe ich mit dem Code abgefangen, gleichwohl der sicherlich noch verbesserungsfähig ist.
 
W

winter2

Gast
Hallo,

mit Preparedstatements kenne ich mich nicht aus, aber ich habe mir eben mal kurz die Beschreibung der Methode durchgelesen. Man könnte mit einem try-catch-Kontrukt so vorab erkennen, ob es sich um ein zuläsiges Datum handelt. Allerdings würden Werte wie 2.5.199 ebenfalls nicht richtig erkannt.

Ich denke, die Methode von schmeckzilla hat sich erledigt, das ist immer noch nicht sicher genug. Die Klasse von abollm ist aufwendig und umständlich, aber damit läßt sich alles abfangen. Jahreszahl zwischen 1900 und 2100 usw. Die Idee, das Datum durch die Methode format der Klasse SimpleDateFormat formatieren zu lassen, ist klasse - dadurch verschwinden dann auch die Buchstaben am Ende. Warum bin ich da nicht gleich selbst draufgekommen, gleich diesen String weiterzuverwenden?

Ohne die Problematik mit den unsinnigen Jahreszahlen könnte man sich das alles sparen und gleich bei der ersten Methode (zweiter Beitrag von schmeckzilla) bleiben....
Sprich, man ermittelt das Jahr mit
Code:
         GregorianCalendar cal = new GregorianCalendar();
         cal.setTime(theDate); 
         int jahr = cal.get(Calendar.YEAR);

... und prüft dann das Jahr auf den Bereich. In die DB reingeschrieben wird folgender String
Code:
         String datum = dateFormat.format(theDate);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F LimitedQueue auf Datum prüfen Java Basics - Anfänger-Themen 6
DeVolt Java8 Paket Time: Datum prüfen / try-catch Java Basics - Anfänger-Themen 1
A Datum Prüfen Java Basics - Anfänger-Themen 3
A Datum prüfen, ob es vor einem anderen Datum liegt Java Basics - Anfänger-Themen 2
T Datum aus Excel prüfen Java Basics - Anfänger-Themen 2
G Prüfen ob String Datum ist Java Basics - Anfänger-Themen 4
L Datum auf Gültigkeit prüfen Java Basics - Anfänger-Themen 27
G Datum prüfen Java Basics - Anfänger-Themen 7
F Datum auf Exsistenz prüfen Java Basics - Anfänger-Themen 12
M Datum prüfen Java Basics - Anfänger-Themen 6
W Idee für: prüfen, ob String gültiges Datum darstellt? Java Basics - Anfänger-Themen 6
J Datum prüfen Java Basics - Anfänger-Themen 8
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
I Auf vollen Monat prüfen? Java Basics - Anfänger-Themen 22
A Dateiname auf Vorkommen prüfen Java Basics - Anfänger-Themen 29
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
J ArrayList auf bereits vorhanden eintrag prüfen Java Basics - Anfänger-Themen 5
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
B Prüfen, ob Zeit Überschreitung Java Basics - Anfänger-Themen 2
B Sudoku prüfen Java Basics - Anfänger-Themen 13
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
X Array auf Leerstellen prüfen Java Basics - Anfänger-Themen 1
FelixN Prüfen, ob ein 2D-Array rechteckig ist Java Basics - Anfänger-Themen 42
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
B Prüfen, ob Country Code in Europa ist? Java Basics - Anfänger-Themen 24
L Prüfen ob Fax (Tif-Datei) vollständig angekommen ist Java Basics - Anfänger-Themen 15
O Datenstruktur auf SET prüfen in O(n) Java Basics - Anfänger-Themen 32
O Einzelne Bits umwandeln und prüfen Java Basics - Anfänger-Themen 23
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
B Prüfen, ob Datum2 der gleiche Tag ist wie Datum1 Java Basics - Anfänger-Themen 10
Dimax Erste Schritte String Eingabe Prüfen Java Basics - Anfänger-Themen 11
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
S Array doppelter Wert prüfen Java Basics - Anfänger-Themen 7
B Prüfen, ob es schon einen Termin gibt in einem Zeitraum Java Basics - Anfänger-Themen 5
K Linux Speicherplatz mit Java prüfen Java Basics - Anfänger-Themen 4
O Array nach gleichen Zahlen prüfen und ausgeben Java Basics - Anfänger-Themen 6
G Compiler-Fehler Auf Anagramm prüfen Java Basics - Anfänger-Themen 1
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Input/Output Prüfen wie oft etwas eingegeben wurde Java Basics - Anfänger-Themen 2
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
C Klassen Reguläre Ausdrücke auf Gleichheit prüfen Java Basics - Anfänger-Themen 5
M Erste Schritte Java prüfen ob eine der Möglichkeiten erfüllt ist Java Basics - Anfänger-Themen 2
R Auf Nachkommastellen prüfen. Java Basics - Anfänger-Themen 2
P Argumente auf plausibilität prüfen... Java Basics - Anfänger-Themen 8
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
B String mit Emailadresse prüfen Java Basics - Anfänger-Themen 11
E 2D Arrays auf Ungleichheit prüfen! Java Basics - Anfänger-Themen 5
MrSnake Prüfen ob TitledPane schon besteht Java Basics - Anfänger-Themen 2
B Serial Key prüfen -> String mit privatem Key und dann abgleichen; Summe = 0 Java Basics - Anfänger-Themen 8
N Compiler-Fehler Iban prüfen Java Basics - Anfänger-Themen 7
J Prüfen ob Arrays nur mit einem Wert belegt sind Java Basics - Anfänger-Themen 3
M String prüfen Java Basics - Anfänger-Themen 7
E Prüfen ob Sammlung gesetzt wurde - Lebensmittelsammlung Java Basics - Anfänger-Themen 8
H Zufällig generierte Zahlen auf Eingabe prüfen Java Basics - Anfänger-Themen 5
S Prüfen ob bestimmter Ordner geöffnet ist (Windows XP) Java Basics - Anfänger-Themen 5
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
S String auf Pallindromeigenschaft prüfen Java Basics - Anfänger-Themen 15
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
Screen Input/Output Wie prüfen ob Stream1 in Stream2 enthalten ist (on-the-fly) ? Java Basics - Anfänger-Themen 5
P Seite auf Inhalt prüfen Java Basics - Anfänger-Themen 2
I Prüfen ob Webseite existiert Java Basics - Anfänger-Themen 3
Z Inputs prüfen Java Basics - Anfänger-Themen 6
G Textdatei auf Dubletten prüfen Java Basics - Anfänger-Themen 8
I Prüfen von zwei Listen Java Basics - Anfänger-Themen 1
K zwei Rechtecke auf Berührung prüfen Java Basics - Anfänger-Themen 2
G String auf Format prüfen Java Basics - Anfänger-Themen 3
J Eingabewert übergeben und prüfen von showInputDialog Java Basics - Anfänger-Themen 4
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
S Array befüllen & auf doppelte werte prüfen Java Basics - Anfänger-Themen 6
M Prüfen, ob Zeichen eine Zahl ist Java Basics - Anfänger-Themen 3
M Punkt auf eine Farbe prüfen Java Basics - Anfänger-Themen 8
C Datentypen Prüfen of eine Zahl Quadratzahl ist Java Basics - Anfänger-Themen 2
K Eindimensionalen Array prüfen Java Basics - Anfänger-Themen 5
M Konstruktor auf null prüfen, Arrays Java Basics - Anfänger-Themen 9
O Prüfen ob ein String den selben Namen hat wie eine Booleanreihe? Java Basics - Anfänger-Themen 17
J Arrays prüfen und über if Bedingung ausgeben Java Basics - Anfänger-Themen 15
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
S OOP long prüfen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben