可能性のある複製:
JavaScriptで「無効な日付」日付インスタンスを検出
有効な日付を検出するために次を使用していました。
var text = $('#Date').val();
var date = Date.parse(text);
if (isNaN(date)) {
// Invalid date
}
しかし、Date.parseは以下を有効な日付(mm/dd/yyyy)と見なしていることがわかりました
日数が月の合計日数を超えたときに無効な日付を検出する他の方法はありますか?
更新:さらに大きな問題は、jQuery検証プラグインもこれを無効な日付として検出しないことです!
溶液:
@Guffaのコメントに基づいて、日付を検証する次の関数を作成しました。
function validDate(text) {
var date = Date.parse(text);
if (isNaN(date)) {
return false;
}
var comp = text.split('/');
if (comp.length !== 3) {
return false;
}
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y, m - 1, d);
return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d);
}
日付が有効かどうかを確認するには、日付のコンポーネントを解析し、そこからDate
オブジェクトを作成し、データ内のコンポーネントが解析済みのコンポーネントと同じかどうかを確認します。範囲外のコンポーネントからDate
オブジェクトを作成すると、値は次/前の期間に流れて有効な日付を作成します。
たとえば、new Date(2011,0,42)
は、2011年4月12日ではなく、2011年2月11日の日付を含むオブジェクトを作成します。
完全な日付ではなくコンポーネントを解析することにより、異なる日付形式の問題も回避できます。私のブラウザは、たとえばy-m-d
のではなく d/m/y
。
例:
var text = '2/30/2011';
var comp = text.split('/');
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
alert('Valid date');
} else {
alert('Invalid date');
}
日付形式がM/D/YYYY
に固定されている場合、解析された日付を再フォーマットし、入力と一致するかどうかを確認できます。
var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();
ただし、空白やゼロが埋め込まれた数字は許容されません。
ユーザーの入力を正確に保持する必要がない場合は、とにかく日付を再フォーマットして、ユーザーが入力したふりをすることができます。
ただし、それもできない場合は、RegExpを使用して自分でコンポーネントを解析し、Date
メソッドの値と比較します。
これを手動で行うスクリプトを作成できます。
function checkDate(day, month) {
if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) {
alert("Date is valid")
}
else if (month == 2 && day <= 28) {
alert("Date is valid")
}
else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) {
alert("Date is valid")
}
else {
alert("Date is in-valid")
}
}
もちろん、うるう年に注意する必要もありますが、年の最初の2桁が4で割り切れない限り、100ではなく4で割り切れる年はうるう年であることを覚えておいてください。この関数に含めます。
例は間違っています
正しいです
if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)
<=
の代わりに =
しかし、例は素晴らしいです!