# Datum richtig einlesen und testen



## mobile (27. Jan 2007)

Hi, 
habe folgende Aufgabe zu lösen.

1. Es soll eine Zeichenkette der Form TT.MM.JJJJ  eingelesen werden. Das mache ich mit Hilfe der IOTools. Im Moment so: 

```
System.out.println("Geben Sie ein Datum ab dem 01.01.1601 ein");
int tag = IOTools.readInteger("\nGeben Sie einen Tag ein: ");
int monat = IOTools.readInteger("Geben Sie einen Monat ein: ");
int jahr = IOTools.readInteger("Geben Sie ein Jahr ein: ");
```

das Ganze wird dann an eine Klasse übergeben, die den Wochentag ausrechnet. So weit ist alles klar, diese Ausgabe soll aber nur erfolgen wenn...

2. die Zeichenkette ein gültiges Datum darstellt, das heißt ich muss zwei Tests durchführen. Erstmal muss ich das Datum auf Format TT.MM.JJJJ testen. 
Mir geht es nur darum, zu testen ob die einzellnen Variablen tag, monat wirklich aus 2 Stellen und jahr aus 4 Stellen bestehen. Wie soll ich das mit der Eingabe s.o machen? 

Der Test soll in einer selbstgeschriebeben Klasse stattfinden, deren Objekte Ausnahmen
sind, die ausgelöst werden, wenn eine Zeichenkette eingelesen wird, die kein gültiges
Datum darstellt. 

Das heißt ich übergebe der Klasse die Variablen und teste erstmal das Format. Wie es weiter geht ist klar nur den Test weiß ich eben nicht.

War der Test des Formates erfolgreich, dann muss ich noch testen ob es das Datum überhaupt gibt. Das wäre dann das nächste Problem. 

Gibt es in Java nicht Methoden, die das ganze für mich übernehmen?

Sind alle Test erfolgreich üergebe ich die Variablen an meine Klasse die ich schon habe, dass ist dann kein Problem mehr.


Danke für eure Hilfe!


----------



## André Uhres (27. Jan 2007)

```
package basics;
/*
 * TestZeichenkette.java
 */
import java.text.*;
public class TestZeichenkette extends Exception{//die Objekte dieser Klasse sind Ausnahmen
    /*So benutzt man die Klasse (Beispiel):
     *
     *  TestZeichenkette test = new TestZeichenkette();
     *  try {
     *      test.testDatum("29", "02", "2007");
     *  } catch (TestZeichenkette ex) {
     *      System.out.println(ex.getMessage());
     *  }
     *-->Ausgabe: Datum gibt's net.
     */
    private String meldung;
    final private SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy");{
        formatter.setLenient( false );//inputs must match this object's format
    }
    public void testDatum(
            final String tag,
            final String monat,
            final String jahr)    throws TestZeichenkette{
        if(tag==null || monat==null || jahr==null){
             fehler("'null' ist im Datum nicht erlaubt");
        }
        if(tag.length() != 2){
            fehler("TAG: Länge der Zeichenkette nicht = 2");
        }
        //...
        try {
            formatter.parse( tag+monat+jahr ) ;
        } catch ( Exception exception) {
            fehler("Datum gibt's net.");
        }
    }
    private void fehler(final String str) throws TestZeichenkette{
        meldung = str;
        throw this;
    }
    //Overrides method getMessage of class java.lang.Throwable
    @Override public String getMessage() {return meldung;}
}
```


----------



## gast (27. Jan 2007)

So also ich habe es jetzt geschafft richtig einzulesen und die Form usw. zu testen.
Also, der Formattest ist erfolgreich!  yes!

Jetzt  habe ich nur noch das Problem, dass ich testen muss, ob es ein Datum auch gibt, den 29.02.2001 gibt es ja nicht. Wie kann ich das jetzt testen? Gibt es vielleicht eine Methode in Java die auf gültige Daten zugreift (zB Kalender im Rechner) und mein Datum damit vergleicht?

Am besten wäre noch wenn ich den Startwert der Daten selbst bestimmen könnte, zb 01.01.1601.

Danke für eure Hilfe!


----------



## gast (27. Jan 2007)

danke auch für eure Hilfe 

Habs jetzt nach ca. 12 stunden alleine und wahrscheinlich umständlicher hinbekommen.

Naja, immerhin hab ich ne Menge gelernt


----------

