【スポンサーリンク】2018-08-09開始と終了日付から稼働日数(営業日数)を算出してみるJavaScriptスポンサーリンク今回は、開始日付と終了日付から、その期間の稼働日数(営業日数)を算出してみます。ロジックを考えることがメインですが、コードはJavaScriptで記載します。稼働日数を算出するのに、土日など週の中での定休日と祝日について考慮する必要があります。今回は以下の条件で考えてみます。週の定休日となる曜日を自由に指定できる。祝日となる日付を自由に指定できる。今回は開始日付が終了日付以下の関係が担保された状態のものとし、このチェックロジックは含めません。開始日付と終了日付からの単純な期間を求める場合、JavaScriptではDateオブジェクトのタイムスタンプの差分で算出します。開始日付と終了日付が同じ場合、1日と考えると以下のようになります。1;開始日付から終了日付の間の各日付について、定休日となる曜日か、または祝日かを判定していくことで稼働日数を算出することも可能ですが、無駄な部分も多いので定休日の判定と祝日の判定を別けて対応します。これらを大きく別けると以下のようになります。開始日付と終了日付の期間となる日数を算出する(上記で算出済み)。対象期間の中で定休日となる日数を算出する。対象期間の中で祝日となる日数を算出する。対象期間から定休日となる日数と祝日となる日数を差し引いて、稼働日数を算出する。定休日となる日数を算出するここでの定休日は曜日を指定してのものです。この指定した曜日の数が、一週間での定休日の日数となります。ある期間に含まれる週の数と一週間の定休日数を掛ければ簡単に求められことになります。割り切れない余りについては、個別に判定する必要があります。これらを順に行っていきます。一週間の定休日の日数を算出する。対象期間に含まれる週数を算出して、週数分の定休日の日数を算出する。対象期間の中で上記の週数に含まれない余りを算出して、その余りの日数に含まれる定休日の日数を算出する。JavaScriptではDateオブジェクトの曜日は、0が日曜日で順に連番され、6が土曜日という数値になります。定休日となる設定はこれらの数値を配列で保持しているものとします。regularDayOff.length;上で算出している開始日付から終了日付の対象期間を7で割った商がその期間に収まる週の数となります。余りの日数については、日毎に判定する必要があります。今回は余りが出た場合は開始日付から、その余りの日数分だけ曜日の判定を行うようにしてみます。lenDayOff;後は余り日数の部分を開始日付から曜日の判定を行います。曜日の判定は剰余演算子を使用します。JavaScriptでは「%」です。};これで、対象期間に含まれる定休日の日数が算出できました。祝日となる日数を算出する続いて対象期間に含まれる祝日の日数を算出します。祝日は自由に指定できる想定ですが、それらを配列で設定したものとします。比較できるようにするためタイムスタンプに変換します。そのタイムスタンプと開始日付と終了日付を比較して日数を算出します。祝日の一覧をタイムスタンプに変換する。祝日の一覧から開始日付のタイムスタンプより大きく、終了日付のタイムスタンプより小さい祝日を探し、カウントする。祝日は「YYYY/MM/DD」の形式で配列で保持しているものとします。['2018/01/01','2018/01/02','2018/01/09'];この祝日の一覧をタイムスタンプに変換するのですが、いくつか処理を検討します。この祝日の一覧ですが、ソートされていない状態のもであればソートします。ソートしておくことで日付の比較を行う際に終了日付より大きくなったところで、それ以後は比較する必要がなくなります。続いて祝日と定休日の問題です。祝日の中に定休日となる曜日の日付が含まれている場合、定休日の処理と合わせてカウントされてしまいます。よって定休日の曜日に含まれる日付について除いたものだけをタイムスタンプにした配列を作成して比較に使用します。}祝日のタイムスタンプ一覧ができたら、日付の比較を行いカウントします。祝日のタイムスタンプ一覧から、開始日付のタイムスタンプより大きい祝日があったら以後は終了日付のタイムスタンプより小さい祝日をカウントすることで祝日の日数を求めることができます。}以上で対象期間とその期間に含まれる定休日の日数と祝日の日数の算出ができました。後は差引した結果が稼働日数となります。holidays;稼働日数の算出ができたので利用しやすい形式に関数などを設定して下さい。まとめ今回は稼働日数(営業日数)の算出ロジックを考えてみました。はてなブログPro非エンジニアがプロジェクト管理ツールを開発しています。現在、利用停止しています。2スポンサーリンク【スポンサーリンク】はてなブログをはじめよう!oooprojectさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。