JavaScriptで祝日を判定する関数

2007年以降の日本の国民の祝日を判定する関数を作りました。その日が祝日であればその名称、祝日でなければ空文字を返します。
2016年から実施の「山の日」にも対応しています。

2019年2月22日追記
2019年対応、2020年対応について反映しました。

2020年12月31日追記
2021年対応について反映しました。

function getNationalHoliday(dateobj) {
  //祝日を判定する関数。
  //祝日ならばその名称、祝日でなければ空文字を返す。
  //20140808 公開。
  //20190221 修正。2019年対応(天皇の即位の日等)を反映。
  //20190221 修正。2020年対応(スポーツの日等)を反映。
  //20201229 修正。2021年対応(海の日、スポーツの日、山の日)を反映。
  var nen, tsuki, hi, yobi;
  if(dateobj.getFullYear() < 2007) {
    throw new Error("2007年以上にしてください。");
  }
  nen = dateobj.getFullYear();
  tsuki = dateobj.getMonth() + 1;
  hi = dateobj.getDate();
  yobi = dateobj.getDay();

  //2019年限定
  if( nen == 2019 && tsuki == 5 && hi == 1 ){
    return "天皇の即位の日";
  }else if(nen == 2019 && tsuki == 10 && hi== 22 ){
    return "即位礼正殿の儀の行われる日";
  //2020年限定
  }else if(nen == 2020 && tsuki == 7 && hi== 23 ){
    return "海の日";
  }else if(nen == 2020 && tsuki == 7 && hi== 24 ){
    return "スポーツの日";
  }else if(nen == 2020 && tsuki == 8 && hi== 10 ){
    return "山の日";
  //2021年限定
  }else if(nen == 2021 && tsuki == 7 && hi== 22 ){
    return "海の日";
  }else if(nen == 2021 && tsuki == 7 && hi== 23 ){
    return "スポーツの日";
  }else if(nen == 2021 && tsuki == 8 && hi== 8 ){
    return "山の日";
//一般
  }else if(tsuki == 1 && hi == 1) {
    return "元日";
  }else if(tsuki == 2 && hi == 11) {
    return "建国記念の日";
  }else if(tsuki == 4 && hi == 29) {
    return "昭和の日";
  }else if(tsuki == 5 && hi == 3) {
    return "憲法記念日";
  }else if(tsuki == 5 && hi == 4) {
    return "みどりの日";
  }else if(tsuki == 5 && hi == 5) {
    return "こどもの日";
  }else if(nen >= 2016 && nen != 2020 && nen != 2021 && tsuki == 8 && hi == 11) {
    return "山の日"; //2016年から。2020年と2021年だけ別。
  }else if(tsuki == 11 && hi == 3) {
    return "文化の日";
  }else if(tsuki == 11 && hi == 23) {
    return "勤労感謝の日";
  }else if(nen<=2018 && tsuki == 12 && hi == 23) {
    return "天皇誕生日";//2018年まで。2020年は天皇の即位の日。
  }else if(nen >= 2020 && tsuki == 2 && hi == 23) {
    return "天皇誕生日";//2020年から。
  }else if(tsuki == 1 && yobi == 1 && 7 < hi && hi < 15) {
    return "成人の日"; //1月第2月曜日。
  }else if(nen != 2020 && nen != 2021 && tsuki == 7 && yobi == 1 && 14 < hi && hi < 22) {
    return "海の日"; //7月第3月曜日。2020年と2021年だけ別。
  }else if(tsuki == 9 && yobi == 1 && 14 < hi && hi < 22) {
    return "敬老の日"; //9月第3月曜日。
  }else if(nen<=2019 && tsuki == 10 && yobi == 1 && 7 < hi && hi < 15) {
    return "体育の日"; //10月第2月曜日。2019年まで。
  }else if(nen >=2022 && tsuki == 10 && yobi == 1 && 7 < hi && hi < 15) {
    return "スポーツの日"; //10月第2月曜日。2022年から。2020年と2021年だけ別。
  }else if(tsuki == 3 && hi == shunbun(nen)) {
    return "春分の日";
  }else if(tsuki == 9 && hi == shubun(nen)) {
    return "秋分の日";
  }else{
    return "";
  }
}

春分の日と秋分の日はちょっと計算が複雑なので別にしました。

function shunbun(nen) {//春分の日
  if(nen < 1900 || nen > 2099) {
    return 0;
  }
  if(nen % 4 === 0) {
    return nen <= 1956 ? 21 : (nen <= 2088 ? 20 : 19);
  } else if(nen % 4 == 1) {
    return nen <= 1989 ? 21 : 20;
  } else if(nen % 4 == 2) {
    return nen <= 2022 ? 21 : 20;
  } else {
    return nen <= 1923 ? 22 : (nen <= 2055 ? 21 : 20);
  }
}
function shubun(nen) {//秋分の日
  if(nen < 1900 || nen > 2099) {
    return 0;
  }
  if(nen % 4 === 0) {
    return nen <= 2008 ? 23 : 22;
  } else if(nen % 4 == 1) {
    return nen <= 1917 ? 24 : (nen <= 2041 ? 23 : 22);
  } else if(nen % 4 == 2) {
    return nen <= 1946 ? 24 : (nen <= 2074 ? 23 : 22);
  } else {
    return nen <= 1979 ? 24 : 23;
  }
}

コメント

タイトルとURLをコピーしました