# DateFormat und die Kalenderwoche 1



## lairdchris (13. Januar 2009)

Hallo,

ich hab da ein Problem mit DateFormat. Die Klasse scheint nicht in der Lage zu sein, ein Datum über die Kalenderwoche zu parsen, wenn der Wochenanfang nicht im gleichen Jahr liegt. (Für 2007 klappts nämlich, da war der 1.1. ein Montag)

Beispiel:

```
SimpleDateFormat df = new SimpleDateFormat("'KW' w yyyy");
df.setLenient(false);

try {
  String datum1 = df.format(new Date());
  System.out.print(datum1 + " => ");
  Date date1 = df.parse(datum1);
  System.out.println(DateFormat.getDateTimeInstance().format(date1));

  String datum2 = df.format(new GregorianCalendar(2009, 00, 01).getTime());
  System.out.print(datum2 + " => ");
  Date date2 = df.parse(datum2);
  System.out.println(DateFormat.getDateTimeInstance().format(date2));
}
catch (ParseException ex) {
  ex.printStackTrace();
}
```

liefert mit JDK 1.6 die folgende Ausgabe:

```
KW 3 2009 => 12.01.2009 00:00:00
KW 1 2009 => java.text.ParseException: Unparseable date: "KW 1 2009"
	at java.text.DateFormat.parse(DateFormat.java:337)
	at DateTest.main(DateTest.java:20)
```

Das Programm funktioniert mit JDK 1.4 problemlos. Mit JDK 1.6 klappts nur, wenn ich "df.setLenient(false)" weglasse, das brauche ich aber.

Weiß jemand was über das Problem oder hat jemand einen Workaround?


----------



## zeja (13. Januar 2009)

Probiers mal mit 1.5, geht wahrscheinlich auch nicht. setLenient wurde in 1.5 angepasst, so dass es korrekt arbeitet.

Die Doku sagt:


> Specify whether or not date/time parsing is to be lenient. With lenient parsing, the parser may use heuristics to interpret inputs that do not precisely match this object's format. With strict parsing, inputs must match this object's format.



Da der Beginn der KW1 nunmal nicht in 2009 liegt, ist es korrekt bei setLenient(false) einen Fehler zu werfen.


----------



## lairdchris (14. Januar 2009)

Naja, so ganz korrekt finde ich das nicht.
Wenn per Definition die KW 1/2009 nun mal am 29.12.2008 beginnt, dann sollte das auch so interpretiert werden, wenn ich setLenient(false) setze. Der Fall ist ja nicht wirklich selten.

Ich muss mir dann wohl einen Workaround überlegen, dass ich in bestimmten Fällen die Prüfung doch "lenient" mache, obwohl ich's eigentlich nicht zulassen wollte, dass der Anwender z.B. den 36.02. als Datum eingibt...


----------

