2013-04-05 16 views
8

Eseguo un programma Java su un computer Windows. Sto cercando di ottenere un elenco di fusi orari e le relative informazioni correlate. Ecco il programma completo:Java non produce informazioni corrette sul fuso orario

String[] allTimeZones = TimeZone.getAvailableIDs(); 
    Date now = new Date(); 
    for (int i = 0; i < allTimeZones.length; i++) { 
     TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]); 
     System.out.format("%s;%s; %f \n", 
          allTimeZones[i], 
          tz.getDisplayName(), 
          (float) (tz.getOffset(now.getTime())/3600000.0)); 
    } 

Uno di fuso orario generato ha le seguenti informazioni:

America/New_York; Eastern Standard Time; -4.000000

Questo è sconcertante. In questo momento, New York è nell'ora legale estiva orientale. Quindi le informazioni di cui sopra non sono corrette.

Qualcuno sa come posso fare Java per generare

America/New_York; Eastern Standard Time; -5,000000

o qualcosa di simile

America/New_York; Orientale estate ora legale; -4.000000

Grazie per l'aiuto!

saluti

+1

http://www.timeanddate.com/worldclock/city.html?n=179 –

+0

Stai chiedendo come ottenere tutti i fusi orari del mondo, o come per ottenere l'ora locale definita dal sistema operativo del computer su cui è in esecuzione il codice? –

+1

Inoltre, controlla [JodaTime] (http://joda-time.sourceforge.net/) che è considerata una migliore libreria di data e ora nel complesso. –

risposta

2

Usa getDisplayName(daylight, style), passando in true per daylight. Questo ti stampare:

America/New_York;Eastern Daylight Time; -4.000000 

Ma si dovrà determinare se l'ora corrente è in ora legale o meno (o che sarà sempre tornare "Daylight Time", anche in autunno e inverno). Questo dovrebbe fare il trucco:

String[] allTimeZones = TimeZone.getAvailableIDs(); 
Date now = new Date(); 
for (int i = 0; i < allTimeZones.length; i++) { 
    TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]); 
    System.out.format("%s;%s; %f \n", allTimeZones[i], 
      tz.getDisplayName(tz.inDaylightTime(now), TimeZone.LONG), 
      (float) (tz.getOffset(now.getTime())/3600000.0)); 
} 
+0

Grazie. Tu sei il mio eroe! L'ho provato Assicurati solo di aver capito bene. Il tuo codice determina e visualizza correttamente se ogni zona è in Standard o Daylight Saving time e offset, corretta? – curious1

+0

In realtà, potrebbe funzionare solo per il fuso orario; Non l'ho testato in modo approfondito, ma è possibile modificare l'impostazione del fuso orario sul computer e provare diverse date (ad esempio, l'ora legale negli Stati Uniti inizia prima dell'ora legale in Europa, quindi prova intorno a quelle date). Si noti inoltre che se si desidera l'offset senza considerare l'ora legale, utilizzare tz.getRawOffset() (senza argomenti). Ad esempio, nel fuso orario orientale, ciò restituirebbe -5 ore indipendentemente dal giorno dell'anno. – Jimothy

+0

Jimothy, ho provato diverse date e fusi orari, sembra che l'elenco dei fusi orari e le loro informazioni siano corretti. Ancora una volta, grazie! – curious1