JavaScript检测有效日期

Nic*_*sen 37 javascript jquery date jquery-validate

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

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

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

if (isNaN(date)) {
      // Invalid date
}
Run Code Online (Sandbox Code Playgroud)

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

  • 二零一一年二月三十零日
  • 2011年11月31日

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

更新:一个更大的问题是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);
}
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 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');
}
Run Code Online (Sandbox Code Playgroud)

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