在Javascript中验证错误日期

时间:2019-03-14 17:38:49

标签: javascript date

我正在遵循this示例来验证日期字符串。

尽管下面的示例计算结果为true。

var date = new Date('12/21/2019');
console.log(date instanceof Date && !isNaN(date.valueOf()));

这个下面的示例即使是一个错误的日期也将计算为true。按错误的日期表示,日历中不存在该日期。

var date = new Date('02/31/2019');
console.log(date instanceof Date && !isNaN(date.valueOf()));

有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

使用momentjs

moment("02/30/2019", "MM/DD/YYYY", true).isValid(); // false
moment("03/30/2019", "MM/DD/YYYY", true).isValid(); // true

来自库的当前文档,这里:isValid momentjs

moment("not a real date").isValid(); // false

您仍然可以通过拆分字符串并评估每个部分来编写自己的解决方案。这种方法的问题在于,不仅 2月不是31天,还有其他几个月也只有30天。因此开发“非越野车”解决方案将需要一些时间。

答案 1 :(得分:2)

由于实现之间的不一致,不建议使用new Date('02/31/2019')(隐式调用Date.parse)解析日期。

  

在ES5之前,不建议使用Date.parse   字符串完全取决于实现。还有很多   不同主机解析日期字符串(因此日期)的方式不同   字符串应该手动解析(如果有很多库可以提供帮助   可以容纳不同的格式。

来源:MDN

相反,您可以使用正则表达式提取部分日期,然后根据您所假定的时区使用new Date(year, monthIndex, day)new Date(Date.UTC(year, monthIndex, day))构造日期对象。

然后,您可以将新创建​​的日期对象格式化为字符串,并检查其是否与初始字符串相同。如果日期回溯到下个月(例如2月30日至3月1日),则字符串将不匹配。

function parseMMDDYYY(str) {
    const match = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
    if (!match) {
        throw new Error(`Invalid date format ${str}`);
    }
    const [, m, d, y] = match;
    const date = new Date(Date.UTC(y, m - 1, d));
    if (!date.toISOString().startsWith(`${y}-${m}-${d}`)) {
        throw new Error(`Invalid date ${str}`);
    }
    return date;
}

try {
    console.log(parseMMDDYYY('02/31/2019'));
} catch (e) {
    console.log(e.toString());
}

try {
    console.log(parseMMDDYYY('12/21/2019'));
} catch (e) {
    console.log(e.toString());
}

答案 2 :(得分:2)

很大程度上取决于允许的输入格式,但这对于您的示例来说可能是解决方案(纯JS,没有额外的库):

Object