2016-03-22 6 views
0

Ich habe dieses Stück Code:Calendar.HOUR_OF_DAY Verwirrung

Calendar cal = Calendar.getInstance(); 
cal.setTime(pDatum); 
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2))); 
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4))); 
cal.set(Calendar.MILLISECOND, 0); 
System.out.println(cal.getTime()); 

wo pDatumSun Mar 27 00:00:00 CET 2016 ist, pHHMMTP ist 02485 und pHHMMTP.substring(0, 2) ist 02.

Die Ausgabe lautet:

Sun 27. März 03.48.00 CEST 2016

Ich würde erwarten:

Sun 27. März 02.48.00 CEST 2016

Zuerst dachte ich, es ist ein TimeZone Problem, aber wi th diesen Code bekomme ich die gleiche Ausgabe:

Calendar cal = Calendar.getInstance(); 
TimeZone tz = TimeZone.getTimeZone("GMT"); 
cal.setTimeZone(tz); 
cal.setTime(pDatum); 
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2))); 
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4))); 
cal.set(Calendar.MILLISECOND, 0); 

Sehen Sie mein Problem?

Antwort

2

CET bedeutet Mitteleuropäische Zeitzone. In Europa gibt es eine Vorstellung von Daylight Saving Time.

Grundsätzlich wird im Winter die Stunde von 1h verschoben. Aus praktischen Gründen (Qualität des Schlafes tatsächlich), ist die Zeitschaltuhr am ersten Sonntag des Frühlings, der der 27. März 2016 ist, getan. Auch aus praktischen Gründen ist die Zeitschaltuhr in der Nacht, zwischen 02.00 Uhr getan und 03:00 Uhr, so dass die Uhren wie folgt zählen: 01:58, 01:59, 03:00, 03:01. Dies bedeutet, Sun Mar 27 02:48:00 CET 2016existiert nicht.
Als Konsequenz, wenn Sie Ihren Code auf Sun Mar 27 ausführen, erhalten Sie 03:48, aber wenn Sie es auf Mon Mar 28 ausführen, erhalten Sie 02:48.

Versuchen mit beiden Terminen:

//Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("27/03/2016 CET"); 
Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("28/03/2016 CET"); 

Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
cal.set(Calendar.HOUR_OF_DAY, 2); 
cal.set(Calendar.MINUTE, 48); 
cal.set(Calendar.MILLISECOND, 0); 

System.out.println(cal.getTime()); 

Ausgang:

Mo 28. März 02.48.00 CEST 2016

+0

ja, das war das Problem. Die Sommerzeit ändern ... Thx viel –

+2

@Tom Der Grund dahinter, dass die OP den falschen Tag und die falsche Stunde verwendet, weil die Zeitschaltuhr zwischen 02:00 Uhr und 03:00 Uhr fertig ist. Infolgedessen existiert '27 Mar 02: 48' nicht. Uhren zählen wie 02:58 Uhr, 02:59 Uhr, 4:00 Uhr, 4:01 Uhr ... –

+0

@Tom bearbeitet. Versucht, um es klar zu machen, aber mein Englisch ist nicht sehr gut :) Zögern Sie nicht zu bearbeiten und umzuformulieren, wenn Sie ein Muttersprachler sind. –

1

Es ist ein Time-Zone Problem, du baust du die Kalender in GMT, aber Drucken des Datums in CEST-Zone.

Edit:

Wenn das Datum mit der gleichen Zeitzone gedruckt wird, dann ist es ok:

Calendar cal = Calendar.getInstance(); 
    TimeZone tz = TimeZone.getTimeZone("GMT"); 
    cal.setTimeZone(tz); 
    cal.set(Calendar.HOUR_OF_DAY, 2); 
    cal.set(Calendar.MINUTE, 48); 
    cal.set(Calendar.MILLISECOND, 0); 

    System.out.println(cal.getTime()); // <-- System default Zone 

    DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
    formatter.setTimeZone(tz); 

    System.out.print(formatter.format(cal.getTime())); // <-- Same TimeZone 

Ausgang:

Tue Mar 22 03:48:06 CET 2016 
Tue Mar 22 02:48:06 GMT 2016 
+0

@Tom du hast recht, 27 märz 2016 Stunden von 2 bis 3 gibt es nicht da Sommerzeit. Aber wenn er zu GMT wechselt und das Datum mit CET druckt, wird es nicht passen. Ich werde das beheben –

+0

Jetzt funktioniert es, aber mit einem Nachteil: das gedruckte Datum ist in einer anderen Zeitzone. Die Sommerzeit ist so nervig: D. – Tom