うるう年チェック

function isLeapYear(_year) { if (_year.length == 0 || isNaN(_year) ) { return false; } var year = parseInt(_year, 10); if (year % 400 == 0) { return true; } if (year % 4 == 0 && year % 100 != 0) { return true; } }

日付チェック

方法(1)

うるう年を考慮した上で、月数、日数の妥当性をチェックします。
うるう年チェックには、上記isLeapYear関数を使います。

function checkDate(_year, _month, _day) { //全て空白の場合 if (_year.length == 0 && _month.length == 0 && _day.length == 0) { return true; } if (_year.length == 0 || _month.length == 0 || _day.length == 0) { return false; } if (isNaN(_year) || isNaN(_month) || isNaN(_day)) { return false; } var year = parseInt(_year, 10); var month = parseInt(_month, 10); if (year < 0 || 9999 < year) { return false; } if (month < 1 || 12 < month) { return false; } var day = parseInt(_day, 10); var daysArray = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); var endDay = daysArray[month - 1]; //うるう年の調整 if (month == 2 && isLeapYear(year)) { endDay = endDay + 1; } if (day < 1 || endDay < day) { return false; } return true; }

方法(2)

Dateオブジェクトが、引数に不正な値を与えられた場合、自動的に適正な値に調整する機能を利用します。

function checkDate(strYear, strMonth, strDay) { if (strYear.length == 0 && strMonth.length == 0 && strDay.length == 0) { return true; //全スペースはOK } if (strYear.length == 0 || strMonth.length == 0 || strDay.length == 0) { return false; } if (isNaN(strYear) || isNaN(strMonth) || isNaN(strDay)) { return false; } var tmpDat = new Date(strYear, strMonth-1, strDay); if (strYear != tmpDat.getFullYear() || (strMonth - 1) != tmpDat.getMonth() || strDay != tmpDat.getDate()) { return false; } else { return true; } }

休日チェック

引数に指定された日が、日本の休日か否かをチェックします。
但し、春分・秋分の判定計算の有効期間が1980-2099までとなっており、 月曜休日が施行されたのは2000年からなので、この関数の有効期間は2000-2099となります。

function isHoliday(year, month, day) { var i; //日の決まった祝日 holiday1 = new Array("1/1", "2/11", "4/29", "5/3", "5/4", "5/5", "11/3", "11/23", "12/23"); md = month + "/" + day; for (i=0; i<holiday1.length; i++) { if (md == holiday1[i]) { return true; } } //春分の日 syunbun = Math.floor(20.8431 + 0.242194 * (year - 1980)) - Math.floor((year - 1980) / 4); if (md == ("3/" + syunbun) ) { return true; } //秋分の日 syuubun = Math.floor(23.2488 + 0.242194 * (year - 1980)) - Math.floor((year - 1980) / 4); if (md == ("9/" + syuubun) ) { return true; } //月曜休日 holiday2 = new Array("1/2", "7/3", "9/3", "10/2"); week = new Date(year, month-1, day).getDay(); if (week != 1) { return false; //月曜でなければfalse } //第何週の月曜か monday = Math.ceil(day / 7); mw = month + "/" + monday; for (i=0; i<holiday2.length; i++) { if (mw == holiday2[i]) { return true;; } } //振り替え休日 if (isHoliday(year, month, day-1)) { return true; } return false; }