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

时间:2016-03-23 13:39:28

标签: javascript date

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

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

返回2015-03-01T13:02:49.073Z(3月1日)。

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

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

try
{
  var date = new Date("2015-02-29T13:02:49.073Z");
  console.log(date.toISOString());
}
catch(e)
{
    console.log("error: " + e.message);
}

火狐:

  

无效日期

Chrome:

  

(没有,只是切换到下一个日期。)

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

jsfiddle example

6 个答案:

答案 0 :(得分:4)

我使用此功能检查日期是否有效:

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 :(得分:4)

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

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

答案 2 :(得分:2)

我为你写了一个小函数:

function check_date(str){
    try{
        return str == new Date(str).toISOString()
    }catch(e){
        return false;
    }
}

试试这个

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/

答案 3 :(得分:0)

我发现这种行为很有趣。我过去只是将输入转换为日期(就像你已经完成的那样),然后更新文本框中的文本以显示JavaScript解释的日期,这样用户就可以看到生成的(有效)日期。

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

http://momentjs.com/

答案 4 :(得分:0)

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

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

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();

答案 5 :(得分:0)

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

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中引发错误。