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

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

指定された日時が、動作させる日時なのか否かを判定する方法

2019年の終わりに書いた以下の記事で
ajya.hatenablog.jp

コーディングのテクニックの記事も書きたいのですが、ロジックをどのように実装したのかの記事も書いてみたいです。 ロジックの記事は、図解が必要になってくるので、時間がしっかりとれないと書きにくく感じています。

はてなブログでブログを書くようになって8年経ちました - ソフトウェア開発者の日常

と書いたので、ロジックについての記事を書きます。
図解なしでどこまで説明できるかの実験も兼ねています。

装置を動作させる時間帯なのか否かを判定したい

指定された日時が、ある装置を動作させる時間帯なのか判定するロジックが必要になりました。

前提として

  • 日付毎に、動作させる日/動作させない日の定義がデータベースに登録されている。
  • 動作させる時間の始まりの時刻の定義がデータベースに登録されている。
  • 動作させる時間の終わりの時刻の定義がデータベースに登録されていない。

という条件があります。


具体的にどのように設定されているか例を書くと、動作させる日/動作させない日は、

  • 1月6日(月):動作させる日
  • 1月7日(火):動作させる日
  • 1月8日(水):動作させる日
  • 1月9日(木):動作させる日
  • 1月10日(金):動作させる日
  • 1月11日(土):動作させない日
  • 1月12日(日):動作させない日
  • 1月13日(月):動作させる日

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

動作させる時間の始まりの時刻は、

  • 動作させる時間の始まり:8時

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


動作させる時間の終わりの時刻はないので、日付と動作させる時間の始まり時刻の組み合わせで24時間毎の時間帯と考えます。

  • 1月6日(月)8時~1月7日(火)8時:動作させる時間帯
  • 1月7日(火)8時~1月8日(水)8時:動作させる時間帯
  • 1月8日(水)8時~1月9日(木)8時:動作させる時間帯
  • 1月9日(木)8時~1月10日(金)8時:動作させる時間帯
  • 1月10日(金)8時~1月11日(土)8時:動作させる時間帯
  • 1月11日(土)8時~1月12日(日)8時:動作させない時間帯
  • 1月12日(日)8時~1月13日(月)8時:動作させない時間帯
  • 1月13日(月)8時~1月14日(火)8時:動作させる時間帯


この前提で

  • 1月6日(月)8時
  • 1月9日(木)4時
  • 1月11(土)1時
  • 1月12日(日)20時
  • 1月13日(月)6時

という時間が指定された場合、稼働させる時間帯に該当すると判定するのが、

  • 1月6日(月)8時
  • 1月9日(木)4時
  • 1月11(土)1時

となります。

稼働させない時間帯に該当すると判定するのが、

  • 1月12日(日)20時
  • 1月13日(月)6時

となります。

ひらめき
unsplash-logoDiego PH

装置を動作させる時間帯なのか否かを判定する方法

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

  1. 動作させる時間帯、動作させない時間帯の区切りが、動作させる時間の始まりで決まるので、時刻が動作させる時間より前であれば前日に置き換える。
  2. 日付が、動作させる日なのか動作させない日なのか判定する。


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

  • 1月6日(月)8時
  • 1月9日(木)4時
  • 1月11(土)1時
  • 1月12日(日)20時
  • 1月13日(月)6時

のうち、時刻が動作させる時間の始まりより前の時刻である、1月9日(木)、1月11(土)、1月13日(月)を前日に置き換えます。

置き換えると、以下のようになります。

  • 1月6日(月)8時==>1月6日(月)
  • 1月9日(木)4時==>1月8日(水)
  • 1月11(土)1時==>1月10(金)
  • 1月12日(日)20時==>1月12日(日)
  • 1月13日(月)6時==>1月12日(日)

置き換えた結果を元に、動作させる日なのか動作させない日なのか判定をします。

  • 1月6日(月)8時==>1月6日(月)==>動作させる日
  • 1月9日(木)4時==>1月8日(水)==>動作させる日
  • 1月11(土)1時==>1月10(金)==>動作させる日
  • 1月12日(日)20時==>1月12日(日)==>動作させない日
  • 1月13日(月)6時==>1月12日(日)==>動作させない日

これで正しく判定できました。


当初は、

  • 動作させる時間帯が1月6日(月)8時~1月11日(土)8時だから、この時間帯に当てはまれば、動作させる日時と判定
  • 動作させない時間帯が1月11日(土)8時~1月13日(月)8時だから、この時間帯に当てはまれば、動作させない日時と判定

と考えて、それぞれの時間帯をどうやって作り出そうかと悩みましたが、もっとあっさりできる上記の方法を思いつきました。

なるべくシンプルで、目的の動作をするようにロジックは考えたいです。