勤怠管理や商品発送など、祝日かどうかの判定が必要となるケースが多々ありますが、祝日は国や地域によって異なるため、JavaScript側で自動的に判定することができません。
この記事では、ある日付が日本の祝日に該当するかどうかを判定する手順を紹介します。
祝日のリストを作る
祝日かどうかを判定するには、大きく分けて、リストを作って照合する方法と、計算式で判定する方法の2つがあります。
それぞれ一長一短ありますが、筆者個人はリストを作る方法をおすすめしています。あらかじめ祝日のリストを作る負担は生じますが、リストアップにかかる時間は、たとえ数年分でも10分かそこらですし、追加や修正を行う際に、複雑な分岐を読み解く必要がないからです。
ここでは例として、2018年~2020年の3年分の祝日と振替休日のリストを作成します。同じ形式で年を追加していくことで、より広い範囲の祝日を判定できるようになります。もちろん、オリジナルの休日を加えることも可能です。
const holidayList = { 2018: { 0: [1, 8], 1: [11, 12], 2: [21], 3: [29, 30], 4: [3, 4, 5], 5: [], 6: [16], 7: [11], 8: [17, 23, 24], 9: [8], 10: [3, 23], 11: [23, 24] }, 2019: { 0: [1, 14], 1: [11], 2: [21], 3: [29], 4: [3, 4, 5, 6], 5: [], 6: [15], 7: [11, 12], 8: [16, 23], 9: [14], 10: [3, 4, 23], 11: [23] }, 2020: { 0: [1, 13], 1: [11], 2: [20], 3: [29], 4: [3, 4, 5], 5: [], 6: [20], 7: [11], 8: [21, 22], 9: [12], 10: [3, 23], 11: [23] } };
Date
オブジェクトのgetMonth
メソッドの結果は0~11なので、リストでも月を0~11としていることに注意してください。
判定用の関数を作成する
あらかじめ祝日のリストが用意されているため、判定用の関数は極めてシンプルです。
function isHoliday (date) { // 年月日を取得 const y = date.getFullYear(); const m = date.getMonth(); const d = date.getDate(); // 祝日リストに日付が含まれるかどうか調べ、結果を返す return holidayList[y][m].indexOf(d) !== -1; }
Date
オブジェクトを引数として受け取り、年月日を取得して、祝日のリストに該当があるかどうかをチェックするだけです。
完成版ソースコードと動作サンプル
ここまでのソースコードの完成版と動作サンプルは、以下でご確認ください(結果の出力にconsole.log
を使っているので、出力はコンソールで確認してください。)。