2010-01-19 5 views
7

Lassen Sie sich den folgenden Code betrachten:seltsames Problem mit Zeitzone, Kalender und Simple

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US); 
long start = sdf.parse("10:30:00 30/09/2009").getTime(); 
long end = sdf.parse("10:30:00 30/10/2009").getTime(); 

Calendar c = Calendar.getInstance(Locale.US); 
c.setTimeInMillis(start); 
System.out.println("Start = " + c.getTime()); 
c.setTimeInMillis(end); 
System.out.println(" End = " + c.getTime()); 

Wenn diesen Code-Schnipsel laufen, ich habe die folgende Ausgabe:

Start = Wed Sep 30 10:30:00 CEST 2009 
    End = Fri Oct 30 10:30:00 CET 2009 

Warum erhalte ich andere Zeitzone?

anzumerken, dass, wenn ich das erste Datum im August und die zweiten im September gesetzt ist, wird der Ausgang in beiden Fällen dieselbe Zeitzone anzuzeigen:

long start = sdf.parse("10:30:00 30/08/2009").getTime(); 
long end = sdf.parse("10:30:00 30/09/2009").getTime(); 

anzeigt:

Start = Sun Aug 30 10:30:00 CEST 2009 
    End = Wed Sep 30 10:30:00 CEST 2009 

I mit ‚m Java 1.6.0_14

+0

Ist es zum Winter Zeitschaltuhr Ende Oktober zu tun? Wenn ja, wie kann man das loswerden? – romaintaz

+0

Sie nicht. Sie können die "CEST" auf "CET" zwingen, aber das wird zu einer anderen Stunde führen (der Oktober wird 11:30 anstelle von 10:30 sein). Es ist das gleiche wie GMT (na ja, jetzt UTC) und London Zeit: wenn DST an ist, London Zeit technisch GMT + 1 MEZ ist GMT + 2 usw. – laura

+0

Was genau tun Sie erreichen wollen? * Warum * denkst du, du musst die Sommerzeit loswerden? –

Antwort

9

CEST ist Mitteleuropäische Sommerzeit. Es ist das gleiche wie CET mit Tageslichteinsparungen in Wirkung.

+0

Das habe ich vermutet, aber wie kann ich dann dieses Sommerzeit loswerden? – romaintaz

+0

Warum willst du es loswerden? CET ist -01: 00, während MESZ -02: 00 (Stunden der Differenz zur GMT-Zeit, für die keine Sommerzeitumstellung vorgenommen wird). Dies ist die Konvention für Zeitzonen und du solltest sie nicht brechen. Was genau willst du erreichen? Ist das eine Präsentation oder ein Berechnungsproblem? – kgiannakakis

+0

Korrektur: CET ist +1 und CEST ist +2 –

0

Ja, wird es auf die Sommerzeit bezogen. Wenn Sie eine Zeitzone verwenden, die Sommerzeit erkennt, wird sie automatisch verwendet. Sie können GMT zum Beispiel verwenden, wenn Sie dies nicht möchten.

6

Sie können die Standardzeitzone

import java.util.TimeZone; 
...   
    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // or "Etc/GMT-1" 

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US); 
    long start = sdf.parse("10:30:00 30/09/2009").getTime(); 
    long end = sdf.parse("10:30:00 30/10/2009").getTime(); 

    Calendar c = Calendar.getInstance(Locale.US); 
    c.setTimeInMillis(start); 
    System.out.println("Start = " + c.getTime()); 
    c.setTimeInMillis(end); 
    System.out.println(" End = " + c.getTime()); 

Verwendung TimeZone.getAvailableIDs() setzen alle verfügbaren IDs zu sehen.

EDIT: Sie können auch eine neue Simple verwenden

TimeZone.setDefault(new SimpleTimeZone(60 * 60 * 1000, "CET"));