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

DarthShader

Erfahrenes Mitglied
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:

Code:
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!
 
Könnte vielleicht daran liegen, dass du nicht explizit den GregorianCalendar verwendest?

Java:
	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.
 
Zuletzt bearbeitet:
Hallo Billie,

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

Code:
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?
 
Also meine Ausgabe sieht so aus:

JDK 1.6.0_11 / WIN XP SP 2

Code:
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:

Java:
	public static void main(String[] args) {
		Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("Europe/Berlin"));
		System.out.print(calendar);
	}
 
Zuletzt bearbeitet von einem Moderator:
ä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)
 
Zuletzt bearbeitet:
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:

Java:
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:

Code:
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:

Code:
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.
 
Schau mal in die "Regions- und Sprachoptionen" in der Systemsteuerung ;-)

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

Neue Beiträge

Zurück