第5章 日付と時刻の新たな API : 問題 7 : イベント
問題
カレンダーのイベント(例えば、指定された日付の午前10時から午後11時まで)に適した、時刻のインターバルを表す TimeInterval クラスを実装せよ
あと、二つのインターバルが重なっているかどうかを検査するメソッド提供せよ
解答
“指定された日付の” とは、どういう意味か?
TimeInterval は、日付情報を持たない時刻の範囲なのか?
日付も考慮した時間の範囲なのか?
iPhone のカレンダーアプリのイベントや録画予約のように、日付も考慮した時間の範囲としよう
■ コンストラクタ
public class TimeInterval { /** 開始時刻 */ public final LocalDateTime from; /** 終了時刻 */ public final LocalDateTime to; // 同じ日のイベント public TimeInterval(LocalDate date, LocalTime from, LocalTime to) { this(date.atTime(from), date.atTime(to)); } public TimeInterval(LocalDateTime from, LocalDateTime to) { if (from.isAfter(to)) { throw new IllegalArgumentException("不正な開始/終了時刻"); } this.from = from; this.to = to; } }
■ 二つのインターバルが重なっているかどうかを検査
public boolean isOverlap(TimeInterval other) { LocalDateTime start = from.isAfter(other.from) ? from : other.from; LocalDateTime end = to .isBefore(other.to) ? to : other.to; // 録画予約のように、終了時刻と開始時刻が同じときは重なっていないとする return start.isBefore(end); }