为什么javaScript允许创建日期,例如
invalidDate = new Date(2015,3,31);
我试图在4月31日创建一个日期。相反,JavaScript会创建一个日期为2015年5月1日00:00:00。我们应该在创建之前验证日期吗?
有些情况下我们尝试解析无效日期并且它会做同样的事情。当给定日期可能无效时,如何正确解析日期?
var invalidDate = new Date(2015, 3, 31);
alert(invalidDate);
答案 0 :(得分:2)
您可以使用Date API创建日期和检查结果:
function makeDate(year, month, day) {
var d = new Date(year, month, day);
if (d.getFullYear() !== year || d.getMonth() !== month)
throw new Error("Invalid date");
return d;
}
如果当天不是指定月份的有效日期,那么将调整月份;这是Date API的一个功能,允许简单的“日期数学”。如果上面的代码注意到输入值已被更正,则会引发异常。
答案 1 :(得分:1)
因为4月31日没有,所以它会给你最近的有效日期......
为清楚起见,如下所示,任何高于有效日期的整数都将翻转到下个月。
即。日期(2016,0,1)是2016年1月1日。
日期(2016,0,61)在该日期增加了60天,从2016年2月29日开始到3月,因此......
日期(2016,0,61)= 2016年3月1日
因此,日期(2015,3,31)= 2015年4月30日加上一天= 2015年5月1日
答案 2 :(得分:1)
您可以使用以下函数验证日期:
function isValidDate(year, month, day) {
var m = month - 1; // Note: the month is 0-based
var d = new Date(year, m, day);
/*
For invalid dates, either the day or month gets changed:
2015-04-31 -> 2015-05-01
2015-02-29 -> 2015-03-01
2015-13-10 -> 2016-01-10
2016-00-10 -> 2015-12-10
*/
return d.getDate() == day && d.getMonth() == m;
}
答案 3 :(得分:-1)
通常,您永远不应该信任用户输入。因此,您应该尝试将它们置于无法输入错误数据的情况下。这可以通过验证或想到一个只允许他们选择有效日期的用户界面来完成。
您可以查看有关验证日期的一些示例:Detecting an "invalid date" Date instance in JavaScript。如果你使用的是javascript框架,他们可能已经内置了一些内容。
至于它的工作原理和“让你这样做”,我怀疑这是因为javascript的解析函数计算“自1970年1月1日,00:00:00 UTC以来经过的毫秒数”。然后使用生成的毫秒数,javascript将其表示为正确的日期。