CUBは子供の白熊

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

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