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()); }

上記の方法では、表示するオフセットを表す列挙型パラメーターを使用します。

public enum OffsetBase { GMT, UTC }

それでは、コードをさらに詳しく見ていきましょう。

使用可能なすべてのゾーンIDを取得したら、LocalDateTime.now()で表される実際の時間参照が必要です。

その後、JavaのStream APIを使用して、タイムゾーンの文字列IDのセット内の各エントリを反復処理し、対応するオフセットを持つフォーマット済みのタイムゾーンのリストに変換します。

これらのエントリごとに、map(ZoneId :: of)を使用してZoneIdインスタンスを生成します

3.オフセットの取得

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

特定のゾーンのUTCオフセットを取得するには、LocalDateTimeのgetOffset()メソッドを使用できます。

また、Javaは+00:00オフセットをZとして表すことに注意してください。

したがって、オフセットがゼロのタイムゾーンで一貫した外観の文字列を作成するには、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 { @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列挙値ごとに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コードとの主な違いは、オフセットの計算です。

rawOffset我々はから取得タイムゾーン()getRawOffset()メソッドは、ミリ秒単位でタイムゾーンオフセットのを表現します

したがって、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で入手できます。