CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第5章 日付と時刻の新たな API : 問題 8 : タイムゾーンと時差

問題

現在の時刻インスタンスに対してサポートされる全てのタイムゾーンおいて、今日の日付のオフセット(UTC との差)を取得せよ

解答

UTC との時差は、以下の流れで算出する

ゾーンID(ZoneId
   ↓
そのゾーンIDの日付時間(ZonedDateTime
   ↓
UTC の日付時間との差(Duration

ただ、Java 8 には Duration のフォーマッターが提供されていない(トホホ...)ので、それを実装する

■ Duration(時差を想定して分まで)のフォーマッティング

public static String format(Duration duration) {
    if (!duration.isNegative()) {
        return String.format("+%d:%02d", duration.toHours(), duration.toMinutes() % 60);
    } else {
        duration = duration.negated();
        return String.format("-%d:%02d", duration.toHours(), duration.toMinutes() % 60);
    }
}

では、全てのタイムゾーンの時差を求めてみよう

LocalDateTime now = LocalDateTime.now();
ZonedDateTime utcNow = ZonedDateTime.of(now, Clock.systemUTC().getZone());

ZoneId.getAvailableZoneIds().stream()
//  .peek(id -> System.out.print(id + ", "))      // この行はデバッグ用
    .map(ZoneId::of)                              // ゾーンID
    .map(zone -> ZonedDateTime.of(now, zone))     // そのゾーンIDの日付時間
    .map(time -> Duration.between(time, utcNow))  // UTC との時差
    .forEach(duration -> System.out.println(format(duration)));