2013-04-12 12 views
9

Gli ID di fuso orario di Joda Time possono essere semplicemente visualizzati con il seguente segmento di codice.Come elencare lo scostamento del fuso orario, l'ID del fuso orario e il nome lungo in Joda Time/Java 8?

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 

for(String zoneId:zoneIds) { 
    System.out.println(zoneId); 
} 

Ma come visualizzare l'offset fuso orario corrispondente ID fuso orario, e il nome lungo in modo che la lista potrebbe essere simile a quanto segue?

(GMT-10:00) Pacific/Honolulu, Hawaii Standard Time 
(GMT-10:00) Pacific/Johnston, Hawaii Standard Time 
(GMT-10:00) Pacific/Fakaofo, Tokelau Time 
(GMT-10:00) HST, Hawaii Standard Time 

Sono necessari per elencare in una casella di riepilogo per la selezione.


Il seguente frammento mostra i nomi, ma l'offset visualizzato sembra storto.

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 

for (String zoneId : zoneIds) { 
    int offset = DateTimeZone.forID(zoneId).getOffset(new DateTime()); 
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName(); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Fuori dalla lunga lista viene visualizzata, alcuni di loro sono mostrati come,

(-36000000) Pacific/Honolulu, Hawaii Standard Time 
(-36000000) Pacific/Johnston, Hawaii Standard Time 
(-36000000) Pacific/Fakaofo, Tokelau Time 
(-36000000) HST, Hawaii Standard Time 

Il compensato dovrebbe essere come mostrato in this lista.

risposta

16

Il seguente approccio ha funzionato.

import java.util.Set; 
import java.util.TimeZone; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName(); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Ci potrebbero essere anche altri e probabilmente modi migliori che io sono in questo momento a conoscenza.


O

import java.util.Set; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String longName = DateTimeZone.forID(zoneId).getName(DateTimeUtils.currentTimeMillis()); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Per Greenwich Mean Time (Etc/GMT+0, per esempio), sarebbe visualizzare, ad esempio +00:00 invece di visualizzare GMT+00:00 come nel primo caso.

Se il nome non è disponibile per la versione locale, allora questo metodo (public final String getName(long instant)) restituisce una stringa nel formato [+ -] hh: mm.

Un adeguato Locale può essere utilizzato anche, se necessario, utilizzando il metodo di overload,

public String getName(long instant, Locale locale) 

nomi brevi, ad esempio per UTC Coordinated Universal Time possono essere visualizzate come segue.

import java.util.Set; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String shortName = DateTimeZone.forID(zoneId).getShortName(DateTimeUtils.currentTimeMillis()); 

    System.out.println("(" + offset + ") " + zoneId + ", " + shortName); 
} 

Con un appropriato Locale, se necessario utilizzando il metodo sovraccaricato,

public String getShortName(long instant, Locale locale) 

Aggiornamento:

Uso del Java Time API in Java SE 8, in cui questo è anche semplificato .

import java.time.ZoneId; 
import java.time.ZoneOffset; 
import java.time.ZonedDateTime; 
import java.time.format.TextStyle; 
import java.util.Locale; 
import java.util.Set; 

Set<String> zoneIds = ZoneId.getAvailableZoneIds(); 

for (String zoneId : zoneIds) { 
    ZoneId zone = ZoneId.of(zoneId); 
    ZonedDateTime zonedDateTime = ZonedDateTime.now(zone); 

    ZoneOffset offset = zonedDateTime.getOffset(); 
    String longName = zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Il nome visualizzato ha vari stili disponibili in java.time.format.TextStyle. Ad esempio, le abbreviazioni possono essere visualizzate usando TextStyle.SHORT.

zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH) visualizzerà nomi lunghi come "India Time". Questo però non è un nome completo a differenza di Joda Time.

Quanto segue visualizzerà un nome completo del nome indicato come "India Standard Time" (ove applicabile).

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzzz"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

visualizza i seguenti un'area offset della zona proposta come GMT+05:30 (notare la capitalizzazione del modello).

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("ZZZZ"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

Quanto segue serve per la visualizzazione delle abbreviazioni.

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzz"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

Capitale ZZZ per la zona-offset come +0530, +0000.

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html