2012-06-14 26 views
6

Ho un problema strano con un Java Calendario Gregoriano:Java GregorianCalendar Fuso orario

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S Z"); 
sdf.setTimeZone(TimeZone.getTimeZone("US/Pacific")); 

GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific")); 
cal1.setTimeInMillis(1320566400000L); 

GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific")); 
cal2.setTimeInMillis(1320570000000L); 

System.out.println(sdf.format(cal1.getTime())); 
System.out.println(sdf.format(cal2.getTime())); 

ho eseguito un dato codice di cui sopra su una macchina con valore predefinito fuso orario = US Pacifico, ma la macchina è in funzione in Germania.

Il risultato è il seguente:

2011-11-06 01:00:00:0 -0700 
2011-11-06 01:00:00:0 -0800 

Io davvero non capisco, perché v'è un fuso orario diverso nel risultato ... Ho anche provato il codice su un'altra macchina (default Timezone = GMT) e funziona correttamente.

Qualcuno ha un'idea, perché si verifica questo problema?

migliore, Michael

+0

Quale versione di Java hai usato? ;-) A volte ci sono bug in una versione e non negli altri. – reporter

+0

Io uso Java 1.6. – Michael

risposta

5

aggiungere queste righe al vostro programma:

for (int i=0; i<24; i++) { 
    cal1.add(Calendar.MINUTE, i*5); 
    System.out.println(" : " + sdf.format(cal1.getTime())); 
} 

e vedrete:

: 2011-11-06 01:00:00:0 -0700 
: 2011-11-06 01:05:00:0 -0700 
: 2011-11-06 01:15:00:0 -0700 
: 2011-11-06 01:30:00:0 -0700 
: 2011-11-06 01:50:00:0 -0700 
: 2011-11-06 01:15:00:0 -0800 
: 2011-11-06 01:45:00:0 -0800 
: 2011-11-06 02:20:00:0 -0800 
: 2011-11-06 03:00:00:0 -0800 

Quindi sembra che tu stia cambiando l'ora legale in inverno. Il mio fuso orario è CET (UTC + 01: 00), quindi non posso dire perché funziona sulla seconda macchina.

+0

Grazie per le informazioni con l'ora legale. In Germania il cambio dell'ora legale è una settimana dopo, quindi non ci ho pensato :) – Michael

2

6 novembre 2011 era quando l'ora legale finiva negli Stati Uniti. Quindi, quello che stai vedendo è che l'orologio ha colpito il 2 novembre il 6 novembre e poi torna alle 1 del mattino per tornare indietro di un'ora all'ora solare. Quindi l'offset cambia anche da -7 a -8 da GMT, credo per il Pacifico. Quindi funziona correttamente da quello che vedo.

0

Si prega di verificare nel vostro pannello di controllo che non hai attivato l'ora legale. Questo bug può essere dovuto a questo