JavaScript 检测有效日期

IT技术 javascript jquery date jquery-validate
2021-03-03 08:00:31

可能的重复:
在 JavaScript 中检测“无效日期”日期实例

我使用以下内容来检测有效日期:

var text = $('#Date').val();
var date = Date.parse(text);

if (isNaN(date)) {
      // Invalid date
}

但是发现Date.parse认为以下是有效日期(mm/dd/yyyy)

  • 2/30/2011
  • 11/31/2011

当天数超过当月的总天数时,还有其他方法可以检测无效日期吗?

更新:一个更大的问题是 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);
}
4个回答

要检查日期是否有效,您可以解析日期的组件,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');
}

演示:http : //jsfiddle.net/Guffa/UeQAK/

这很好用!除非您需要将 date.getDay() 更改为 date.getDate()。
2021-04-17 08:00:31
也许我是偏执狂,但我不知道这将是更安全的使用new Date(Date.UTC())Date.prototype.getUTC*()替代。
2021-04-19 08:00:31
正是我需要的......这是否考虑闰年?
2021-04-22 08:00:31
为什么投反对票?如果您不解释您认为错误的是什么,则无法改善答案。
2021-04-25 08:00:31
我找到的最好的答案之一!谢谢古法
2021-04-28 08:00:31

如果您的日期格式固定为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")
   }
}

当然,您还需要注意闰年,但请记住,任何能被 4 整除而不是 100 整除的年份都是闰年,除非年份的前两位数字能被 4 整除。这应该很容易包含在这个函数中。

在声明中 == 不是=
2021-05-05 08:00:31

例子错了

正确的是

if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)

<= 代替 =

但是这个例子很棒!