# Datum auf Gültigkeit prüfen



## Leeanders (22. Aug 2007)

Hallo Leute,

habe die suche benutzt: "Datum prüfen" aber nichts gefunden.

Wenn ich z.b. eine Zeichenkette "10.10.1980" habe wie überprüfe ich ob die form selbst xx.xx.XXXX stimmt und ob die Zahlen selbst auch gültig sind?


----------



## Wildcard (22. Aug 2007)

SimpleDateFormatter


----------



## L-ectron-X (22. Aug 2007)

...ohne *ter*.


----------



## Wildcard (23. Aug 2007)

ups


----------



## The_S (23. Aug 2007)

Ob das Datum existiert (also korrekt ist), kannst du mit GregorianCalendar überprüfen.


----------



## Leeanders (27. Aug 2007)

Hallo,


Unparseable date: "11_10_1983" und warum wird "05.11.122376" nicht als ungültig behandelt ?


```
public void testDate() throws ParseException, java.text.ParseException
    {            
            for(int i = 0 ; i < dimension.getRowCount(); i++ )
            {                   
                    String datum =  dimension.getValueAt(i,2).toString();
                                               
	            try
	            {                                 
	                Date parseDate = (Date)formatter.parse(datum);
	                
	            }                        
	            catch(NullPointerException  e)
	            {
	                e.printStackTrace();
	               
	            }
	            catch(IllegalArgumentException  e)
	            {
	                e.printStackTrace();
	              
	            }
	            finally {    }
	       }                               
    }
```


Aufruf:


```
try {
					testDate();
					} catch (ParseException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (java.text.ParseException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
```

Hat mir jemand einen Hinweis, wie ich ein datum mit "_" zeichen parsen kann und warum das datum mit der 6 zeichen Jahreszahl nicht mokiert wird?


----------



## Leeanders (27. Aug 2007)

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  :?:


----------



## Gast (27. Aug 2007)

@Leeanders

Na warten wir mal 120369 Jahre ab.

Schau dir mal den Konstruktor der Klasse SimpleDateFormat an.


```
new SimpleDateFormat();
```
ergibt: Constructs a SimpleDateFormat using the default pattern and date format symbols for the default locale.


```
new SimpleDateFormat("dd_MM_yyyy");
```
ergibt einen benutzerdefiniertes Datumsformat.


----------



## Leeanders (27. Aug 2007)

Gast hat gesagt.:
			
		

> @Leeanders
> 
> Na warten wir mal 120369 Jahre ab.
> 
> ...



habs mal so geändert: 


> DateFormat formatter = new SimpleDateFormat("dd_MM_yyyy");
> Date parseDate = formatter.parse(datetext);



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.


----------



## orly? (27. Aug 2007)

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.


----------



## Leeanders (27. Aug 2007)

neuester STand: nächstes mal sollte ich meine KOmmentare um den Block entfernen kein wunder ging nix  :shock:  :lol: 



```
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....


----------



## Leeanders (27. Aug 2007)

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... ???


----------



## orly? (28. Aug 2007)

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.


----------



## PELLE (28. Aug 2007)

orly? hat gesagt.:
			
		

> 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.


 schule sind doch ferien? ok anders bundesland... :wink:


----------



## Leeanders (28. Aug 2007)

hallo orly,

hast schon was rausgefunden?

ich habe noch dieses Plugin: http://www.bastian-bergerhoff.com/eclipse/features/web/QuickREx/using.html

gefunden, doch das ist nur zum schnellen testen.


----------



## thE_29 (28. Aug 2007)

Das Problem steht ja in der Hilfe:

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);


----------



## Orly (28. Aug 2007)

Ich sitz noch in der Schule. Nachmittagsunterricht


----------



## orly? (28. Aug 2007)

Soooo endlich:



```
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.


| = oder-Statement
? = one or nothing


----------



## Leeanders (28. Aug 2007)

thE_29 hat gesagt.:
			
		

> Das Problem steht ja in der Hilfe:
> 
> 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.
> 
> ...



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...


```
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:

```
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)
```


----------



## Leeanders (28. Aug 2007)

orly? hat gesagt.:
			
		

> Soooo endlich:
> 
> 
> 
> ...



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 ??


----------



## orly? (28. Aug 2007)

```
Pattern pattern = Pattern.compile("([0-2]?[0-9]|30|31)\\.(0?[0-9]|10|11|12)\\.[0-9][0-9][0-9][0-9]");
```


0? vor die zweite [0-9] setzen, dann passts. Sorry, bei regular expressions muss man immer soviel denken 

Nun akzeptiert er den 1.1.2007 genauso wie den 01.01.2007.


----------



## Leeanders (28. Aug 2007)

orly? hat gesagt.:
			
		

> ```
> Pattern pattern = Pattern.compile("([0-2]?[0-9]|30|31)\\.(0?[0-9]|10|11|12)\\.[0-9][0-9][0-9][0-9]");
> ```
> 
> ...



yo sowas dachte ich mir, dann dachte ich aber verdammt schon so spät ich kann net mehr denken also warte ich bis der orly kommt  :bae:


----------



## hugo (30. Aug 2007)

Leeanders hat gesagt.:
			
		

> 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:
	
	
	
	





```
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.


----------



## thE_29 (30. Aug 2007)

Also wie gesagt, ich würde es zuerst durchs regex würgen!

Und dann mit SimpleDateFormat (setlenient(true)) überprüfen auf korrekte Eingabe!

Also ob 30.2 oder sonstiges..


----------



## orly? (30. Aug 2007)

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.


----------



## JavaB00n (18. Feb 2008)

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.

ich hoffe ihr könnt mir helfen


----------



## The_S (19. Feb 2008)

Für Datum-Eingabefelder verwende ich immer den DatePicker von Microba

http://microba.sourceforge.net/


----------



## JavaB00n (19. Feb 2008)

das problem hat sich erübrigt, hab es hingekriegt


----------

