我正在遵循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()));
有更好的方法吗?
答案 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