1分でできるJavaScriptで国民の祝日を判定する方法

JavaScriptで国民の祝日を判定

JavaScriptのnew Dateによる日付の処理をしている際に国民の祝日を判定したいことがあります。

たとえば2018年1月1日(月)のような月〜金の曜日でも祝日の場合は()のように赤くするなどの処理です。

JavaScriptにはgetHolidayはない

JavaScriptには曜日を数値で取得するgetDayはあるが祝日を取得するgetHolidayのようなものはない。

そのため祝日のデータをあらかじめ用意しておく必要がある。

祝日のデータは自分で作成しない

祝日のデータを自分で作成して判定に使用している人をたまに見かけるが、祝日は毎年変わるしデータを自分で作成するのは手間がかかる。

間違った祝日データを作成してしまう可能性もあるので自作は避けたほうがよい。

内閣府から祝日のデータをダウンロード

内閣府のWebサイトには国民の祝日についてというページが存在する。

サイト内にはCSV形式の国民の祝日のデータが存在するので、祝日のデータはこちらからダウンロードする。

https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

CSVを読み込んで祝日判定に使用する

本題の祝日判定はダウンロードしたCSVファイルをJavaScriptで読み込んでisHolidayという関数を作成し、関数の引数に日付を入れてCSV内のデータと一致するかチェックするだけだ。

一致すれば祝日で、引数はnew DateがInvalid Dateにならない形式で指定する。

function isHoliday(date) {
  const req = new XMLHttpRequest();
  req.open('get', 'syukujitsu.csv', true);
  req.send(null);
  req.onload = function() {
    checkDate(req.responseText, date, function(result) {
      console.log(date, result);
    });
  };
}

function checkDate(str, date, callback) {
  const data = [];
  const nDate = new Date(date);
  let dataArr = [];
  let checkDate =
    nDate.getFullYear() +
    '/' + (nDate.getMonth() + 1) +
    '/' + nDate.getDate();
  let isHoliday = false;
  let tmp = str.split('\n');
  for (let i=0; i< tmp.length; i++) {
    dataArr = tmp[i].split(',');
    if (dataArr[0] === checkDate) {
      isHoliday = true;
      break;
    }
  };
  callback(isHoliday);
}
isHoliday('2018-01-01');
// => 2018-01-01 true

isHoliday('2018-01-02');
// => 2018-01-02 false

isHoliday('2018/08/05 12:34');
// => 2018/08/05 12:34 false

isHoliday('2019-05-05 00:00:00');
// => 2019-05-05 00:00:00 true

祝日判定関数サンプル

「JavaScript 祝日 判定」などで検索すると8月11日を山の日などと判定させるやり方を紹介しているサイトがあるが、祝日は毎年同じ月日とは限らないため、問題を起こす可能性が高いやり方を使用してはならない。