# Calendar und Sommerzeit - Java zeigt mir statt 11 Uhr immer noch 10 Uhr an?



## DarthShader (29. März 2009)

Hallo,

heute Nacht mussten wir ja die Uhr vorstellen - und zack habe ich ein kleines Problem mit Java's Calendar (jdk1.6.0_12). Schaut Euch mal diesen Code an:


```
Calendar c = Calendar.getInstance( Locale.getDefault() );
System.out.println( c.get( Calendar.HOUR_OF_DAY ) );
```

Meine Windows-Uhr zeit mir jetzt gerade "11:55" an. Die Ausgabe nach dem Start des Java Programmes ist jedoch "10:55" - wieso erkennt Java, trotz des default Locales, welches ja stimmen sollte, nicht die korrekte Uhrzeit?

Ich habe in einem anderen Projekt immer darauf vertraut, dass Calendar die korrekte Uhrzeit auch bei Umstellung Sommerzeit/Winterzeit korrekt kennt, muss ich mir diese Wunschvorstellung jetzt nehmen? 


Vielen Dank für Eure Hilfe!


----------



## Billie (29. März 2009)

Könnte vielleicht daran liegen, dass du nicht explizit den GregorianCalendar verwendest?


```
public static void main(String[] args) {
		Calendar calendar = new GregorianCalendar();
		System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
	}
```

Lass dir Mal das komplette aktuelle Datum ausgeben und Informationen über Zeitzone etc.


----------



## DarthShader (29. März 2009)

Hallo Billie,

vielen Dank für Deine Antwort. Wenn ich mir das Calendar-Objekt ausgeben lasse, bekomme ich folgende Informationen:


```
java.util.GregorianCalendar[time=1238327296025,areFieldsSet=true
,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+01:00",offset=3600000,dstSavings=0,useDayligh
t=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2009,MONTH=2,WEEK_OF_YEAR=13,W
EEK_OF_MONTH=4,DAY_OF_MONTH=29,DAY_OF_YEAR=88,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=
48,SECOND=16,MILLISECOND=25,ZONE_OFFSET=3600000,DST_OFFSET=0]
```

Siehst Du da irgendeinen Hinweis auf ein Problem?


----------



## Billie (29. März 2009)

Also meine Ausgabe sieht so aus:

JDK 1.6.0_11 / WIN XP SP 2


```
java.util.GregorianCalendar[time=1238335024734,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2009,MONTH=2,WEEK_OF_YEAR=13,WEEK_OF_MONTH=4,DAY_OF_MONTH=29,DAY_OF_YEAR=88,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=57,SECOND=4,MILLISECOND=734,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
```

Auffällig ist, dass deine Zeitzone GMT+1 ist ... Ist grundsätzlich nicht falsch, aber useDaylight is zB bei dir auf false und bei mir auf true. Und die sollte denke ich bei dir auch true sein, ist nämlich der Hinweis auf Winter-/Sommerzeit.

Probier mal explizit die TimeZone "Europe/Berlin" anzugeben:


```
public static void main(String[] args) {
		Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("Europe/Berlin"));
		System.out.print(calendar);
	}
```


----------



## Anime-Otaku (29. März 2009)

ähm...und was macht er bei einem einfachen Calendar.getInstance() ?

Dieser würde dir ein Calendar Objekt für deine Systemeinstellungen geben. (was dann auch genau deiner Systemzeiteinstellungen entsprechen würde)

In der Sommerzeit sind wir GMT +2, daher ist dein Calendar falsch. Daher nehme ich an, dass deine im System eingestellte Zeitzone auch falsch ist.

Der Locale den du angibst ist nur für die Wochentagen zuständig: "aLocale - the locale for the week data".

P.S.: Ein Calendar.getInstance() ist der bevorzugte Weg sich ein Calendar Objekt zu generieren, da dieser automatisch den zu verwendenen Calendar holt.

(oder benutzt JodaTime)


----------



## DarthShader (31. März 2009)

Vielen Dank für Eure Antworten,

also die ganze Sache ist echt merkwürdig bei mir. Ich habe hier zwei Rechner, einen normalen Entwicklungsrechner und ein Notebook. Das obige Problem trat auf dem Notebook auf. Um das ganze mal etwas besser zu analysieren und zu vergleichen, habe ich auf beiden dasselbe Programm laufen lassen: Hier mal die Infos:

PC: Windows Vista (32Bit), Java jdk1.6.0_07
Notebook: Windows XP Home, Java jdk1.6.0_12

Auf beiden habe ich diesen Code laufen lassen:


```
Calendar calendar = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.S z" );

System.out.println( "timeZone.getDisplayName(): " + calendar.getTimeZone().getDisplayName() );
System.out.println( "timeZone.getID(): " + calendar.getTimeZone().getID() );
System.out.println( "useDaylightTime: " + calendar.getTimeZone().useDaylightTime() );
System.out.println( "Calendar.HOUR_OF_DAY: " + calendar.get( Calendar.HOUR_OF_DAY ) );
System.out.println( df.format( calendar.getTime() ) );
```

Auf dem PC erhalte ich folgende Ausgabe:


```
timeZone.getDisplayName(): Zentraleuropäische Zeit
timeZone.getID(): Europe/Berlin
useDaylightTime: true
Calendar.HOUR_OF_DAY: 9
2009-03-31 09:27:47.982 CEST
```

Auf dem Notebook diese hier:


```
timeZone.getDisplayName(): Mitteleuropäische Zeit
timeZone.getID(): Europe/Berlin
useDaylightTime: true
Calendar.HOUR_OF_DAY: 9
2009-03-31 09:29:12.211 MESZ
```

Die erste kuriosität ist, dass ich am Notebook nichts geändert habe, aber jetzt zeigt er mir die korrekte Zeit (Stunde) an.

Ich habe bemerkt, dass am NB die Option "Uhrzeit automatisch auf Sommer/Winterzeit umstellen" deaktiviert war. Die korrekte Anzeige kam aber schon bei dieser deaktivierten Option. Bei Aktivierung zeigt er mir diesselbe Zeit an. Deaktivere ich es wieder, so ist die Stunde genau um 1 zurück, also wie erwartet. Bei der deaktivierten Option steht die Zeit übrigens in der Java-Ausgabe auf "GMT+01:00", nicht auf "MESZ".

Warum das Notebook "auf einmal" die korrekte Zeit ermittelt, weiß ich nicht.

Ich bin jetzt etwas verwirrt, anscheinend ist ja nun alles ok.

Was ich mir jedoch noch nicht erklären kann, ist der Unterschied von "timeZone.getDisplayName()", auf dem PC ist es "CEST", auf dem Notebook "MESZ". Wieso einmal auf Deutsch und einmal auf Englisch? Beide Rechner sind natürlich auf Deutsch eingestellt.


----------



## Anime-Otaku (31. März 2009)

Schau mal in die "Regions- und Sprachoptionen" in der Systemsteuerung ;-)

Des Weiteren kann das auch ein Unterschied zwischen den Java Versionen sein.


----------



## DarthShader (31. März 2009)

Hallo,

vielen Dank für den Hinweis mit den Java Versionen .Das ist tatsächlich der Fall, es gab einen Bug in DateFormat, den man hier nachlesen kann: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6609737

Ab Version 6_10 scheint das geändert worden zu sein. Mit der gleichen Java Version ist nun jedenfalls alles ok.


----------

