ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

指定された時間帯が、予約できる時間帯なのか否かを判定する方法

昨日書いた記事と同様に、ロジックについての記事を書きます。
ajya.hatenablog.jp

予約ができる時間帯なのか判定したい

指定された時間帯が、予約できる時間帯なのか判定するロジックが必要になりました。

前提として、

  • 既に予約されている場合があり、予約の開始日時/予約の終了日時がデータベースに登録されている。

という条件があります。


具体的にどのように設定されているか例を書くと、予約済の開始日時/予約済の終了日時が、

  • 予約済の開始:2020年1月6日(月)8時~予約済の終了:2020年1月6日(月)20時
  • 予約済の開始:2020年1月8日(水)4時~予約済の終了:2020年1月8日(水)10時
  • 予約済の開始:2020年1月8日(水)22時~予約済の終了:2020年1月9日(木)2時

のようにデータベースに登録されています。


この前提で、予約したい時間帯として、

  • 2020年1月6日(月)15時~2020年1月6日(月)16時
  • 2020年1月7日(火)14時~2020年1月7日(火)15時
  • 2020年1月8日(水)8時~2020年1月8日(水)12時
  • 2020年1月8日(水)20時~2020年1月8日(水)23時
  • 2020年1月9日(木)4時~2020年1月9日(木)7時

という時間帯が指定された場合、予約できると判定するのが

  • 2020年1月7日(火)14時~2020年1月7日(火)15時
  • 2020年1月9日(木)2時~2020年1月9日(木)7時

となります。

予約できないと判定するのが、

  • 2020年1月6日(月)15時~2020年1月6日(月)16時
  • 2020年1月8日(水)8時~2020年1月8日(水)12時
  • 2020年1月8日(水)20時~2020年1月8日(水)23時

となります。

アイデア
unsplash-logoThought Catalog

予約ができる時間帯なのか判定する方法

判定方法を以下のように考えました。

  1. 予約したい時間帯の開始日時が、予約済データの1データ目の終了日時より大きく、予約したい時間帯の終了日時が、予約済データの2データ目の開始日時により小さければ、予約できる時間帯と判定する。
  2. 該当しなければ、1データ目の終了日時と2データ目の開始日時の組み合わせを、2データ目の終了日時と3データ目の開始日時の組み合わせに置き換えて、同様に判定する。
  3. また該当しなければ、2データ目の終了日時と3データ目の開始日時の組み合わせを、3データ目の終了日時と4データ目の開始日時の組み合わせに置き換えて、同様に判定したいけれど、4データ目がないので、ありえない未来の日時に置き換えて、同様に判定する。

繰り返し予約されていない時間帯に当てはまるのか判定をしています。


先ほどの例を元にすると、

  • 予約済データの1データ目の終了日時:2020年1月6日(月)20時 < 予約したい時間帯の開始日時
    AND
    予約したい時間帯の終了日時 < 予約済データの2データ目の開始日時:2020年1月8日(水)4時
  • 予約済データの2データ目の終了日時:2020年1月8日(水)10時 < 予約したい時間帯の開始日時
    AND
    予約したい時間帯の終了日時 <  予約済データの3データ目の開始日時:2020年1月8日(水)22時
  • 予約済データの3データ目の終了日時:2020年1月9日(木)2時 < 予約したい時間帯の開始日時
    AND
    予約したい時間帯の終了日時 <  ありえない終了日時:2038年12月31日(金)24時

で判定します。


予約した時間帯を上から順番に判定していくと、

  • 2020年1月6日(月)15時~2020年1月6日(月)16時 ==> 開始日時、終了日時ともにあてはまりません。
  • 2020年1月7日(火)14時~2020年1月7日(火)15時 ==> 開始日時、終了日時ともにあてはまります。
  • 2020年1月8日(水)8時~2020年1月8日(水)12時 ==> 終了日時はあてはまりますが、開始日時はあてはまります。
  • 2020年1月8日(水)20時~2020年1月8日(水)23時 ==> 開始日時はあてはまりますが、終了日時はあてはまります。
  • 2020年1月9日(木)4時~2020年1月9日(木)7時 ==> 開始日時、終了日時ともにあてはまります。

となります。
これで正しく判定できました。


当初は開始日時、または終了日時のどちらか一方の日時だけで判定できるのでは?と考えていましたが、できない場合に気がついて、上記の判定になりました。