第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)));