可能重复:
Detecting an “invalid date” Date instance in 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);
}
答案 0 :(得分:75)
要检查日期是否有效,您可以解析日期的组件,从中创建Date
对象,并检查数据中的组件是否与解析的组件相同。如果您从超出范围的组件创建Date
对象,则值将流向下一个/上一个句点以创建有效日期。
例如,new Date(2011,0,42)
将创建一个包含日期2/11/2011而不是1/42/2011的对象。
通过解析组件而不是完整日期,您还可以解决不同日期格式的问题。例如,我的浏览器会使用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');
}
答案 1 :(得分:3)
如果您的日期格式固定为M/D/YYYY
,您可以重新格式化已解析的日期并查看它是否与输入匹配:
var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();
但是,这不会容忍空格或零填充数字。
如果您不需要完全保留用户的输入,您可以重新格式化日期并假装这是他们键入的内容。
但是如果你不能这样做,我会使用RegExp自己解析组件,然后将它们与Date
方法中的值进行比较。
答案 2 :(得分:0)
您可以手动编写脚本:
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")
}
}
当然,你也需要注意闰年,但要记住,任何可以被4整除而不是100的年份都是闰年,除非今年的前两位数可被4整除。很容易包含在这个功能中。
答案 3 :(得分:0)
示例错误
正确的是
if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)
<=
代替=
但是这个例子很棒!