日付の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} とかの正規表現チェックも加えればいいと思う