次のアプローチが機能しました。
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);
}
私が今気づいていない他の、おそらくより良い方法があるかもしれません。
または
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);
}
グリニッジ標準時 (たとえば、 )の場合、最初のケースのように表示される代わりにEtc/GMT+0
、たとえば表示されます。+00:00
GMT+00:00
ロケールで名前を使用できない場合、このメソッド ( public final String getName(long instant)
) は [+-]hh:mm 形式の文字列を返します。
Locale
オーバーロードされたメソッドを使用して、必要に応じて適切なものを使用することもできます。
public String getName(long instant, Locale locale)
協定世界時の UTC などの短い名前は、次のように表示できます。
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);
}
Locale
オーバーロードされたメソッドを使用して、必要に応じて適切な を使用して、
public String getShortName(long instant, Locale locale)
アップデート :
Java SE 8 でJava Time APIを使用すると、これがさらに簡素化されます。
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);
}
表示名には、 で使用できるさまざまなスタイルがありますjava.time.format.TextStyle
。たとえば、略語は を使用して表示できますTextStyle.SHORT
。
zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH)
「インド時間」のような長い名前が表示されます。ただし、これは Joda Time とは異なりフルネームではありません。
以下は、「インド標準時」のような名前の完全な名前を表示します (該当する場合)。
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzzz");
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId)));
以下は、指定されたゾーンのゾーンオフセットを表示しますGMT+05:30
(パターンの大文字化に注意してください)。
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("ZZZZ");
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId)));
以下は、略語を表示するためのものです。
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzz");
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId)));
ZZZ
のようなゾーン オフセット+0530
の首都+0000
。
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html