javascriptで休日判定
UWSCで休日判定する際に休日について調べた。
UWSCで祝日を算出する - じゅんじゅんのきまぐれ
その知識を利用して、javascriptで休日判定コードを書いてみた。
2007年以降用ね。(休日の名前を問わない場合は、2003/05/07以降使える)
追記 2018/06/25
2020年東京オリンピック周りの変更を反映。
追記 2014/05/27
「山の日」追加
スクリプト
休日(か日曜)なら、1。休日かつ日曜なら、2。それ以外は0を返す。
var isHoliday = function(d, f) { var ret = 0, dy = d.getFullYear(), dm = d.getMonth(), dd = d.getDate(), da = d.getDay(), b = dy - 1980; if(da == 0) ret++; switch(dm) { case 0: if(dd == 1) ret++; // 元旦 if(da == 1 && Math.ceil(dd / 7) == 2) ret++; // 成人の日 break; case 1: if(dd == 11) ret++; // 建国記念の日 if(dd == 23 && dy > 2019) ret++; // 天皇誕生日 break; case 2: if(dd == Math.floor(20.8431+0.242194*b)-Math.floor(b/4)) ret++; // 春分の日 break; case 3: if(dd == 29) ret++; // 昭和の日 break; case 4: if(dd == 3 || dd == 4 || dd == 5) ret++; // 憲法記念日 みどりの日 こどもの日 break; case 5: break; case 6: if(dy == 2020) { if(dd == 23 || dd == 24) ret++; // 海の日 スポーツの日。2020年特例 } else { if(da == 1 && Math.ceil(dd / 7) == 3) ret++; // 海の日 } break; case 7: if(dd == 11 && dy > 2015 && dy != 2020) ret++; // 山の日 if(dd == 10 && dy == 2020) ret++; // 山の日。2020年特例 break; case 8: if(da == 1 && Math.ceil(dd / 7) == 3) ret++; // 敬老の日 if(dd == Math.floor(23.2488+0.242194*b)-Math.floor(b/4)) ret++; // 秋分の日 break; case 9: if(da == 1 && Math.ceil(dd / 7) == 2 && dy != 2020) ret++; // 体育の日。2020年以降はスポーツの日 break; case 10: if(dd == 3 || dd == 23) ret++; // 文化の日(明治節) 勤労感謝の日(新嘗祭) break; case 11: if(dd == 23 && dy < 2019) ret++; // 平成天皇誕生日 break; } // 振替休日・国民の休日判定 if(!f) { var p = new Date(); p.setTime(d.getTime() - 24 * 3600000); while(isHoliday(p, true) == 1) p.setTime(p.getTime() - 24 * 3600000); if(isHoliday(p, true) == 2) { ret++; } else { var n = new Date(); n.setTime(d.getTime() + 24 * 3600000); p.setTime(d.getTime() - 24 * 3600000); if((p.getDay() > 0 && isHoliday(p) == 1) && (isHoliday(n, true) == 2 || (n.getDay() > 0 && isHoliday(n, true) == 1))) ret++; } } return ret; }
第一引数にDateオブジェクトを渡せば、判定します。
第二引数は内部使用(振替休日と国民の休日判定用)。
グローバル汚染しているので、実使用時には修正した方が良いかも。
2007年より前を知りたい場合、以下を参考にがんばってね。
UWSCで1949年以降の祝日を算出する - じゅんじゅんのきまぐれ