CUBは子供の白熊

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

第5章 日付と時刻の新たな API : 問題 9 : 分の端数がある時差

問題

全てのタイムゾーンおいて、UTC との時差に1時間未満の情報が含まれる全てのタイムゾーンを見つけよ

解答

1時間未満の情報が含まれる” とは、「時差が1時間より小さい」ということではなく、「時差に分の端数が出る」という意味だと解釈した

では、時差に分の端数があるタイムゾーンを求めてみよう

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

ZoneId.getAvailableZoneIds().stream()
    .map(ZoneId::of)                                                      // ゾーンID
    .map(zone -> ZonedDateTime.of(now, zone))                             // そのゾーンIDの日付時間
    .filter(time -> Duration.between(time, utcNow).toMinutes() % 60 != 0) // 分の端数がある
//  .peek(time -> System.out.print(format(Duration.between(time, utcNow)) + ", ")) // デバッグ用
    .map(ZonedDateTime::getZone)                                          // ゾーンIDに戻す
    .forEach(System.out::println);

私の JDK(1.8.0_20) では、以下のとおり

 -9:30, Pacific/Marquesas
 -4:30, America/Caracas
 -2:30, America/St_Johns
 -2:30, Canada/Newfoundland
 +4:30, Asia/Kabul
 +4:30, Asia/Tehran
 +4:30, Iran
 +5:30, Asia/Calcutta
 +5:30, Asia/Colombo
 +5:30, Asia/Kolkata
 +5:45, Asia/Kathmandu
 +5:45, Asia/Katmandu
 +6:30, Asia/Rangoon
 +6:30, Indian/Cocos
 +9:30, Australia/Adelaide
 +9:30, Australia/Broken_Hill
 +9:30, Australia/Darwin
 +8:45, Australia/Eucla
 +9:30, Australia/North
 +9:30, Australia/South
 +9:30, Australia/Yancowinna
+10:30, Australia/LHI
+10:30, Australia/Lord_Howe
+11:30, Pacific/Norfolk
+12:45, NZ-CHAT
+12:45, Pacific/Chatham