# prüfen, ob deutsches Datumsformat (xx.xx.xxxx) - wie?



## Kryptaesthesie (22. September 2008)

Hallo zusammen,
ich möchte gerne eine Funktion haben, die mir ausgibt, ob ein Datum Deutsches Format hat, oder nicht:


```
public static boolean isDeutschesDatumsFormat(String toCheck)
    {
        //  (0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d    <-- von http://www.regular-expressions.info/dates.html
        boolean isDDF = true;
        
        ...
        
        return isDDF;
    }
```
Tests:

```
public static void main(String[] args)
    {
        System.out.println("## " + isDeutschesDatumsFormat("abc")); // --> false
        System.out.println("## " + isDeutschesDatumsFormat("12.31.2008")); // --> false
        System.out.println("## " + isDeutschesDatumsFormat("31.12.2008")); // --> true
        System.out.println("## " + isDeutschesDatumsFormat("31-12-2008")); // --> true
    }
```
Wie stelle ich das am geschicktesten an?
Danke schon mal für eure Hilfe! 


Gruß
Gerrit


----------



## zeja (22. September 2008)

Ich würde es so machen:

```
String testDate = "32.08.1983";
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
Date parsed = sdf.parse(testDate, new ParsePosition(0));
String test = sdf.format(parsed);
System.out.println(testDate.equals(test));
```


----------



## Thomas Darimont (22. September 2008)

Hallo,

warum nicht einfach so:

```
/**
 * 
 */
package de.tutorials;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @author Thomas.Darimont
 * 
 */
public class DateFormatTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String date = "32.08.1983";
		
		try {
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
			simpleDateFormat.setLenient(false);
			System.out.println(simpleDateFormat.parse(date));
		} catch (ParseException e) {
			System.out.println(String.format("%s ist ein ungültiges Datum oder nicht im Format: dd.MM.yyyy",date));
		}
		
	}

}
```

Gruß Tom


----------



## Kryptaesthesie (22. September 2008)

Danke für eure Hilfe 

Ich wollte euch dann nicht meine verwendete Variante nicht vorenthalten:

```
/**
     * Prüft, ob es sich bei dem übergebenen Wert um ein Datum im Format <code>31.12.2008</code> handel.<br />
     * 
     * @param toCheck
     * @return
     */
    public static boolean isDeutschesDatumsFormat(String toCheck)
    {
        if(toCheck != null)
        {
            toCheck = StringUtils.trimToEmpty(toCheck);
            if(toCheck.length() > 10)
                toCheck = StringUtils.left(toCheck, 10);
        
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        try {
        Date parsed = sdf.parse(toCheck, new ParsePosition(0));
        String test = sdf.format(parsed);
        return toCheck.equals(test);
        } catch(Exception e) {
            return false;
        }
        } else {
            return false;
        }
    }
    
    /**
     * Wandelt ein Datum <code>31.12.2008</code> in <code>2008-12-31</code> um.<br />
     * Dieses Datum kann dann für Sortierungen herangezogen werden.<br />
     * <br />
     * Für die Überprüfung wird die Funktion <code>isDeutschesDatumsFormat()</code> benutzt.<br/>
     * Der Parameter <code>deutschesDatum</datum> muss mit einem Datum beginnen. Alles ab der 10ten Position wird ignoriert.<br />
     * Kann das Datum nicht umgewandelt werden, wird der Eingangswert wieder ausgegeben.<br />
     * <br />
     * <ul>
     *     <li><code>datumVonDeutschZuEnglisch("31.12.2008"));</code> = <b>2008-12-31</b></li>
     *  <li><code>datumVonDeutschZuEnglisch("31.12.2008 16:41:15"));</code> = <b>2008-12-31</b></li>
     *     <li><code>datumVonDeutschZuEnglisch("32.12.2008"));</code> = 32.12.2008</li>
     *  <li><code>datumVonDeutschZuEnglisch("31.12.08"));</code> = 32.12.08</li>
     *     <li><code>datumVonDeutschZuEnglisch("XYZ"));</code> = XYZ</li>
     * </ul>
     * <br />
     * @param deutschesDatum
     * @return
     */
    public static String datumVonDeutschZuEnglisch(String deutschesDatum)
    {
        
        if(isDeutschesDatumsFormat(deutschesDatum))
        {
            deutschesDatum = StringUtils.left(StringUtils.trimToEmpty(deutschesDatum), 10);
            String dd = StringUtils.substringBefore(deutschesDatum, ".");
            String mm = StringUtils.substringBetween(deutschesDatum, ".", ".");
            String yyyy = StringUtils.substringAfterLast(deutschesDatum, ".");
            
            return yyyy + "-" + mm + "-" + dd;
        }
        else
        {
            return deutschesDatum;
        }
    }
    
    /**
     * Wandelt ein Datum <code>31.12.2008</code> in <code>2008-12-31</code> um.<br />
     * Dieses Datum kann dann für Sortierungen herangezogen werden.<br />
     * <br />
     * Für die Überprüfung wird die Funktion <code>isDeutschesDatumsFormat()</code> benutzt.<br/>
     * Der Parameter <code>deutschesDatum</datum> muss mit einem Datum beginnen.<br />
     * Kann das Datum nicht umgewandelt werden, wird der Eingangswert wieder ausgegeben.<br />
     * <br />
     * <ul>
     *     <li><code>datumVonDeutschZuEnglisch("31.12.2008", true));</code> = <b>2008-12-31</b></li>
     *  <li><code>datumVonDeutschZuEnglisch("31.12.2008 16:41:15", true));</code> = <b>2008-12-31 16:41:15</b></li>
     *  <li><code>datumVonDeutschZuEnglisch("31.12.2008 16:41:15", false));</code> = <b>2008-12-31</b></li>
     *     <li><code>datumVonDeutschZuEnglisch("32.12.2008", true));</code> = 32.12.2008</li>
     *  <li><code>datumVonDeutschZuEnglisch("31.12.08", true));</code> = 32.12.08</li>
     *     <li><code>datumVonDeutschZuEnglisch("XYZ", true));</code> = XYZ</li>
     * </ul>
     * <br />
     * @param deutschesDatum
     * @return
     */
    public static String datumVonDeutschZuEnglisch(String deutschesDatum, boolean behalteEnde)
    {
        if(isDeutschesDatumsFormat(deutschesDatum))
        {
            String ende = StringUtils.substring(deutschesDatum, 10);
            deutschesDatum = datumVonDeutschZuEnglisch(deutschesDatum);
            
            return deutschesDatum + ((behalteEnde) ? ende : "");
        }
        else
        {
            return deutschesDatum;
        }
    }
```


----------



## zeja (22. September 2008)

Warum kompliziert, wenns auch einfach geht, hmm?

Zum Formatieren von Deutsch nach Englisch eignen sich zwei SimpleDateFormat doch deutlich besser. 

Und Toms Lösung ist auch schicker... ich vergesse jedes Mal wieder dieses blöde setLenient.


----------

