第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分である