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