1. 概要

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

つまり、UTCが標準であり、GMTがタイムゾーンです。

これは、ウィキペディアが何を使用するかに関して私たちに教えていることです:

ほとんどの場合、UTCはグリニッジ標準時(GMT)と互換性があると見なされますが、GMTは科学界によって正確に定義されなくなりました。

つまり、UTCでタイムゾーンオフセットを使用してリストをコンパイルすると、GMTでもリストが作成されます。

まず、これを実現するJava 8の方法を見てから、Java7で同じ結果を得る方法を見ていきます。

2. ゾーンのリストを取得する

まず、定義されたすべてのタイムゾーンのリストを取得する必要があります。

この目的のために、ZoneIdクラスには便利な静的メソッドがあります。

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

次に、 Set を使用して、対応するオフセットを持つタイムゾーンの並べ替えられたリストを生成できます。

public List<String> 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のセット内の各エントリを反復処理し、対応するフォーマットされたタイムゾーンのリストに変換します。オフセット。

これらのエントリごとに、 ZoneId とのインスタンス map(ZoneId :: of)。

3. オフセットの取得

また、実際のUTCオフセットを見つける必要があります。 たとえば、中央ヨーロッパ時間の場合、オフセットは +01:00。になります。

任意のゾーンのUTCオフセットを取得するには、 LocalDateTimeの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. ゾーンの作成比較可能

オプションで、オフセットに従ってタイムゾーンを並べ替えることもできます。

このために、ZoneComparatorクラスを使用します。

private class ZoneComparator implements Comparator<ZoneId> {

    @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<String> utc = display.getTimeZoneList(
          TimezoneDisplay.OffsetBase.UTC);
        utc.forEach(System.out::println);

        System.out.println("Time zones in GMT:");
        List<String> 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およびDateand Time APIを使用することにより、このタスクを容易にします。

ただし、Java 7があり、プロジェクトの前にある場合でも、 getAvailableIDs()メソッドを使用して java.util.TimeZone クラスに依存することで、同じ結果を得ることができます。

public List<String> getTimeZoneList(OffsetBase base) {
    String[] availableZoneIds = TimeZone.getAvailableIDs();
    List<String> 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()のgetRawOffset()メソッドから取得する 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オフセットを使用して利用可能なすべてのタイムゾーンのリストをコンパイルする方法を確認しました。

そして、いつものように、例の完全なソースコードはGitHub入手できます。