GMTとUTCを使用してすべてのタイムゾーンをJavaで表示する

JavaでGMTおよびUTCを使用してすべてのタイムゾーンを表示する

1. 概要

時間と日付を扱うときはいつでも、参照のフレームが必要です。 その標準はUTCですが、一部のアプリケーションではGMTも表示されます。

要するに、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で利用できます。