# String zu Datum parsen - SimpleDateFormat Problem



## AnD3rS (27. Feb 2009)

Hallo.

Ich habe folgendes Problem:
In einer Datei stehen Datensätze mit Datum, dieses Datum muss ich parsen. Ein Beispiel für ein Datum:

```
10/Aug/2008:06:26:03 +0200
```

Parsen will ich das ganze mit SimpleDateFormat
[HIGHLIGHT="Java"]SimpleDateFormat date = new SimpleDateFormat("DD/MMM/yyyy:HH:mm:ss Z");[/HIGHLIGHT]

Jetzt tritt mein Problem auf:
Lasse ich setLenitent auf true, wird der Monatsteil *immer* zu Jan geparst, egal was ich für eine Eingabe parsen lasse. Alle anderen Teile des Datums werden richtig geparst.
Setze ich setLenitent auf false, wird bei jedem Monat außer "Jan" eine ParseException geworfen (Feb, Jul, Aug, Sep, etc).

Ich hab schon verschiedene Locale getestet allerdings tritt der Fehler unabhängig davon auf.

Ein Codeschnippsel:
[HIGHLIGHT="Java"]
date.setLenient(false);
String d1 = "10/Jan/2008:06:26:03 +0200";
String d2 = "10/Aug/2008:06:26:03 +0200";
System.out.println(date.parse(d1));
System.out.println(date.parse(d2));
[/HIGHLIGHT]
Zeile 4 wird zu 
	
	
	
	





```
Thu Jan 10 05:26:03 CET 2008
```
Zeile 5 wirft eine ParseException:

```
Exception in thread "main" java.text.ParseException: Unparseable date: "10/Aug/2008:06:26:03 +0200"
	at java.text.DateFormat.parse(DateFormat.java:337)
	at logreader.LogReader.main(LogReader.java:57)
```
Hat jemand eine Idee an was es liegen könnte?


----------



## SlaterB (27. Feb 2009)

DD steht für Day in Year, dd ist besser


----------



## Verjigorm (27. Feb 2009)

dd anstatt DD

edit: zu langsam *schnüff*

edit2: dd ist nicht nur besser, sondern dd ist RICHTIG


----------



## Der Müde Joe (27. Feb 2009)

D  	Day in year 	Number  	189
-->
http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html


----------



## Ebenius (27. Feb 2009)

Slater hat recht. Der Tag 10 im Jahr existiert nunmal nur im Januar. 

Ebenius


----------



## AnD3rS (27. Feb 2009)

Ahhhh... Danke.

Ich war so aufs Monat fixiert dass ich den Fehler übersehen habe.


----------



## spass-digga (1. Jul 2009)

Hallo,

ich hab ein ähnliches Problem und komme nicht weiter. Ich nutze den Last.fm webservice und krieg dort das Datum als String in folgenden Format zurückgeliefert:

Sun, 12 Jul 2009


```
String datum = "Sun, 12 Jul 2009";
		          
SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy");
df.setLenient(false);

try {
Date date = df.parse(datum);
System.out.println(date.toString());
} catch (ParseException e) {
System.out.println(e.getMessage());
System.out.println("Kein gültiges Datum");
}
```

Das Muster müsste eigentlich passen, aber ich erhalte aber nur eine Exception "unparsable Date". Bin für jeden Hinweis dankbar. 

Gruß
Rudi


----------



## SlaterB (1. Jul 2009)

Trick: das Datum selber als Date erzeugen, vom SimpleDateFormat in einen String formatieren lassen und
mit dem eigenen String vergleichen
-> das Format schreibt "So" statt "Sun", ganz ausgeschrieben "Sonntag" statt "Sunday",

gut, um von da aus zur Lösung zu kommen braucht es noch vertiefte Kenntnisse -> Locale setzen

```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String datum = "Sun, 12 Jul 2009";

        SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy", Locale.ENGLISH);
        df.setLenient(false);


        Date d = new Date(109, 6, 12);
        System.out.println(df.format(d));

        try
        {
            Date date = df.parse(datum);
            System.out.println(date.toString());
        }
        catch (ParseException e)
        {
            System.out.println(e.getMessage());
            System.out.println("Kein gültiges Datum");
        }

    }

}
```


----------



## spass-digga (1. Jul 2009)

Ich danke dir vielmals! Super schnell. Hab da schon ne ganz Weile mit zugebracht, komme endlich weiter und hab wieder was dazugelernt!

Danke nochmal!

Gruß
Rudi


----------

