日付のvalidate

入力文字列が存在する日付かどうかを判定する


こんな感じでどうだろう

function validDate(str) {
    var ymd = str.split('/'); // 年月日のデリミタでsplit.
    var y   = ymd[0];
    var m   = parseInt(ymd[1],10) - 1; // 0 paddingされてる文字列を整数に. "09" => 9
    var d   = parseInt(ymd[2],10);
    var vd  = new Date(y, m, d);
    if (vd.toString()!='Invalid Date' && vd.getFullYear()==y && vd.getMonth()==m && vd.getDate()==d) {
        return true;
    }

    alert('Invalid Date');
    return false;
}


使用

alert(validDate('2009/09/30'));
>> true

alert(validDate('2009/09/31'));
>> false

alert(validDate('2009/09/あ'));
>> false


JSのDateだと存在しない日付でも、はみ出た分を計算してDateオブジェクトにしてくれちゃう

var d = new Date(2009, 8, 31); // 2009/09/31
alert(d.getFullYear() + ', ' + d.getMonth() + ', ' + d.getDate());
>> 2009, 9, 1 // 2009/10/01

なので、Dateオブジェクトに変換する前と後とで年月日を比較して、
ずれがあるかどうかで、存在する日かどうかを判定している


ただ、上のコードだと '2009/009/030'とかも通るので、
その辺も制限したいなら、\d{4}\/\d{1,2}\/\d{1,2} とかの正規表現チェックも加えればいいと思う