Javascript日期允许无效数据(例如2月30日)

Javascript Date allows invalid data (e.g. Feb 30th)

本问题已经有最佳答案,请猛点这里访问。

如何验证日期? 我的意思不是格式,而是逻辑。
例如:2月30日不是有效日期。

1
2
var date = new Date("2015-02-29T13:02:49.073Z"); // 2015 Feb 29th does not exist
console.log(date.toISOString());

Returns 2015-03-01T13:02:49.073Z (March 1st).

但我想要一个这个日期(输入)无效的信息。

编辑:
在Chrome中测试过。 Firefox返回"无效日期"。 但不是解析。
只有在使用日期时(例如toISOString())才会抛出异常。

1
2
3
4
5
6
7
8
9
try
{
  var date = new Date("2015-02-29T13:02:49.073Z");
  console.log(date.toISOString());
}
catch(e)
{
    console.log("error:" + e.message);
}

火狐:

invalid date

铬:

(nothing, just switched to the next date.)

摘要:它取决于浏览器。 所以,不推荐使用。

jsfiddle的例子


我能想到的最简单的事情是将解析的日期转换为ISO字符串并将其与原始输入进行比较:

1
2
3
var input ="2015-02-29T13:02:49.073Z"
var date = new Date(input);
var isValid = (input === date.toISOString());


我使用此函数来检查日期是否有效:

1
2
3
4
5
6
7
8
function isValidDate(year, month, day) {
    month = month - 1;
    var d = new Date(year, month, day);
    if (d.getFullYear() == year && d.getMonth() == month && d.getDate() == day) {
      return true;
    }
    return false;
}


我为你写了一个小函数:

1
2
3
4
5
6
7
function check_date(str){
    try{
        return str == new Date(str).toISOString()
    }catch(e){
        return false;
    }
}

试试这个

1
2
3
console.log(check_date('2015-02-01T13:02:49.073Z'));
console.log(check_date('2015-02-35T13:02:49.073Z'));
console.log(check_date('2015-02-29T13:02:49.073Z'));

https://jsfiddle.net/8o040ctr/


如果您传递一个以'YYYY-MM'格式开头的字符串,就像您在问题中一样,您可以使用此函数:

1
2
3
4
5
6
7
function makeDate(s) {
    var date = new Date(s);
    if (date.toISOString(date).substr(0,7) != s.substr(0,7)) throw"Invalid date";
    return date;
}

dt = makeDate('2015-02-29T13:02:49.073Z');

此makeDate函数将替换普通的new Date(...)调用,但在传递无效的日期字符串时也会在Chrome中引发错误。


浏览器中的日期总是非常棘手,我建议你像js lib一样使用:http://momentjs.com/

然后你可以使用.isValid()方法:

1
2
3
moment('03:55', 'HH:mm').isValid();
moment('2012-05-25', 'YYYY-MM-DD').isValid();
moment('2015-02-29T13:02:49.073Z',"YYYY-MM-DDTHH:mm:ss", true).isValid();


我发现这种行为很有趣。我过去只是将输入转换为日期(如您所做),然后更新文本框中的文本以显示JavaScript解释的日期,以便用户看到生成的(有效)日期。

幸运的是,我们现在可以做得更好。 Moment.js是一个很棒的库,用于处理JavaScript中的日期/时间值。这对我来说确实让生活变得更加轻松!

http://momentjs.com/