CUBは子供の白熊

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

第5章 日付と時刻の新たな API : 問題 10 : 飛行機の到着時間

問題

ロサンジェルスからフランクフルト行きの便は、ローカル時刻の3時50分に出発し、10時間50分のフライトである
何時に到着するか?

個別に計算するのではなく、このような時刻計算を処理できるプログラムを書け

解答

ただメソッドを書いてもつまらないので、飛行機の移動を表すクラスを定義する
フィールドは以下の4つとする

  • 出発地
  • 出発時間
  • 到着地
  • 到着時間

そして地名とゾーンIDの対応をMapで持つ

■ フィールド

public class Flight {
    /** 地名とゾーンIDの対応 */
    private static Map<String, String> aliasMap;

    static {
        Map<String, String> map = new HashMap<String, String>();
        map.put("ロサンジェルス", "America/Los_Angeles");  // -7:00
        map.put("フランクフルト", "CET");                  // +2:00, 中央ヨーロッパ
            :
        aliasMap = Collections.unmodifiableMap(map);
    }

    /** 出発地 */
    public final String departurePlace;
    /** 出発時間 */
    public final ZonedDateTime departureTime;
    /** 到着地 */
    public final String arrivalPlace;
    /** 到着時間 */
    public final ZonedDateTime arrivalTime;
}

では、出発地, 出発時間, 到着地と飛行時間からFlightインスタンスを生成してみよう

コンストラクタ

/**
 * @param departurePlace  出発地
 * @param departureTime   出発時間(出発地での時間)
 * @param arrivalPlace    到着地
 * @param flightTime      飛行時間
 */
public Flight(String departurePlace, LocalDateTime departureTime,
              String arrivalPlace  , Duration flightTime) {
    this.departurePlace = departurePlace;
    ZoneId zone = ZoneId.of(departurePlace, aliasMap);
    this.departureTime = ZonedDateTime.of(departureTime, zone);
    this.arrivalPlace = arrivalPlace;
    zone = ZoneId.of(arrivalPlace, aliasMap);
    this.arrivalTime = this.departureTime.plus(flightTime).withZoneSameInstant(zone);
}

じゃあ、フランクフルトに到着する時間は

Flight flight = new Flight(
    "ロサンジェルス", LocalDateTime.of(LocalDate.now(), LocalTime.of(3, 50)),
    "フランクフルト", Duration.ofMinutes(60*10 + 50)
);
System.out.println(flight.arrivalTime);

現地時間で、23時40分である