JavaでGMTおよびUTCを使用してすべてのタイムゾーンを表示する
1. 概要
要するに、UTCは標準で、GMTはタイムゾーンです。
これは、ウィキペディアが使用するものに関して私たちに伝えるものです:
ほとんどの目的で、UTCはグリニッジ標準時(GMT)と交換可能と見なされますが、GMTは科学界によってもはや正確に定義されていません。
つまり、UTCでタイムゾーンオフセットを使用してリストをコンパイルすると、GMTでもリストが作成されます。
最初に、これを実現するJava 8の方法を見てから、Java7で同じ結果を得る方法を見ていきます。
2. ゾーンのリストを取得する
まず、定義済みのすべてのタイムゾーンのリストを取得する必要があります。
この目的のために、ZoneIdクラスには便利な静的メソッドがあります。
Set availableZoneIds = ZoneId.getAvailableZoneIds();
次に、Setを使用して、対応するオフセットを持つタイムゾーンの並べ替えられたリストを生成できます。
public List getTimeZoneList(OffsetBase base) {
LocalDateTime now = LocalDateTime.now();
return ZoneId.getAvailableZoneIds().stream()
.map(ZoneId::of)
.sorted(new ZoneComparator())
.map(id -> String.format(
"(%s%s) %s",
base, getOffset(now, id), id.getId()))
.collect(Collectors.toList());
}
上記の方法では、表示するオフセットを表すenumパラメータを使用します。
public enum OffsetBase {
GMT, UTC
}
それでは、コードについて詳しく見ていきましょう。
使用可能なすべてのゾーンIDを取得したら、LocalDateTime.now().で表される実際の時間参照が必要です。
その後、JavaのStream APIを使用して、タイムゾーンString IDのセット内の各エントリを反復処理し、対応するオフセットを持つフォーマット済みタイムゾーンのリストに変換します。
これらのエントリごとに、map(ZoneId::of).を使用してZoneIdインスタンスを生成します。
3. オフセットの取得
また、実際のUTCオフセットを見つける必要があります。 たとえば、中央ヨーロッパ時間の場合、オフセットは+01:00.になります。
特定のゾーンのUTCオフセットを取得するには、LocalDateTime’s getOffset()メソッドを使用できます。
また、Javaは+00:00オフセットをZとして表すことに注意してください。
したがって、オフセットがゼロのタイムゾーンのStringを一貫して表示するには、Zを+00:00:に置き換えます。
private String getOffset(LocalDateTime dateTime, ZoneId id) {
return dateTime
.atZone(id)
.getOffset()
.getId()
.replace("Z", "+00:00");
}
4. ゾーンの作成Comparable
オプションで、オフセットに従ってタイムゾーンをソートすることもできます。
このために、ZoneComparatorクラスを使用します。
private class ZoneComparator implements Comparator {
@Override
public int compare(ZoneId zoneId1, ZoneId zoneId2) {
LocalDateTime now = LocalDateTime.now();
ZoneOffset offset1 = now.atZone(zoneId1).getOffset();
ZoneOffset offset2 = now.atZone(zoneId2).getOffset();
return offset1.compareTo(offset2);
}
}
5. タイムゾーンの表示
あとは、OffsetBase enumの値ごとにgetTimeZoneList()メソッドを呼び出して、リストを表示することで、上記の要素をまとめるだけです。
public class TimezoneDisplayApp {
public static void main(String... args) {
TimezoneDisplay display = new TimezoneDisplay();
System.out.println("Time zones in UTC:");
List utc = display.getTimeZoneList(
TimezoneDisplay.OffsetBase.UTC);
utc.forEach(System.out::println);
System.out.println("Time zones in GMT:");
List gmt = display.getTimeZoneList(
TimezoneDisplay.OffsetBase.GMT);
gmt.forEach(System.out::println);
}
}
上記のコードを実行すると、UTCとGMTのタイムゾーンが出力されます。
出力がどのように表示されるかのスニペットは次のとおりです。
Time zones in UTC:
(UTC+14:00) Pacific/Apia
(UTC+14:00) Pacific/Kiritimati
(UTC+14:00) Pacific/Tongatapu
(UTC+14:00) Etc/GMT-14
6. Java7以前
Java 8は、StreamおよびDate and Time APIを使用することにより、このタスクを容易にします。
ただし、Java 7があり、プロジェクトの前にある場合でも、getAvailableIDs()メソッドでjava.util.TimeZoneクラスに依存することで、同じ結果を得ることができます。
public List getTimeZoneList(OffsetBase base) {
String[] availableZoneIds = TimeZone.getAvailableIDs();
List result = new ArrayList<>(availableZoneIds.length);
for (String zoneId : availableZoneIds) {
TimeZone curTimeZone = TimeZone.getTimeZone(zoneId);
String offset = calculateOffset(curTimeZone.getRawOffset());
result.add(String.format("(%s%s) %s", base, offset, zoneId));
}
Collections.sort(result);
return result;
}
Java 8コードとの主な違いは、オフセットの計算です。
TimeZone()‘s getRawOffset() method expresses the time zone’s offset in millisecondsから得られるrawOffset。
したがって、TimeUnitクラスを使用して、これを時間と分に変換する必要があります。
private String calculateOffset(int rawOffset) {
if (rawOffset == 0) {
return "+00:00";
}
long hours = TimeUnit.MILLISECONDS.toHours(rawOffset);
long minutes = TimeUnit.MILLISECONDS.toMinutes(rawOffset);
minutes = Math.abs(minutes - TimeUnit.HOURS.toMinutes(hours));
return String.format("%+03d:%02d", hours, Math.abs(minutes));
}
7. 結論
このクイックチュートリアルでは、UTCオフセットとGMTオフセットを使用して利用可能なすべてのタイムゾーンのリストをコンパイルする方法を説明しました。
そして、いつものように、例の完全なソースコードはover on GitHubで利用できます。