我无法理解为什么javascript在提供无效日期时给出的有效日期等于 1 dec 日期?这种行为是否因特定原因而被纳入语言?因为它必须是我的用例的无效日期 新日期(" 2017年11月31日")
答案 0 :(得分:1)
首先,Date
constructor并非旨在验证输入,甚至不挑剔。相反,它明确地设计为不惜任何代价创建实例,具有以下创意规则:
其中Date被调用为具有多个参数的构造函数,if 值大于它们的逻辑范围(例如13提供为 月份值或分钟值为70),相邻值将为 调整。例如。新日期(2013,13,1)相当于新的 日期(2014年,1,1)
因此,如果您确实需要验证日期,则需要查看其他地方。
关于11/31/2017
,构造函数需要这样:
表示日期的字符串值。字符串应采用格式 由Date.parse()方法(IETF-compliant RFC 2822 timestamps以及ISO8601版本)识别。
......看起来不错。但接下来(强调我的):
使用Date构造函数解析日期字符串(和Date.parse, 由于浏览器,强烈建议不要使用它们 差异和不一致。
如果我们深入研究Date.parse()
个文档,我们最终会读到这个:
ECMAScript规范声明:如果String不符合 该功能的标准格式可以归结为任何 特定于实现的启发式或特定于实现的解析 算法。无法识别的字符串或包含非法元素的日期 ISO格式字符串中的值将导致Date.parse()返回 为NaN。
但是,日期字符串中的无效值无法识别为ISO格式 根据ECMA-262的定义,可能会也可能不会产生NaN,具体取决于 提供的浏览器和值,例如:
// Non-ISO string with invalid date values new Date('23/25/2014');
将被视为2015年11月25日在Firefox 30和Firefox中的当地日期 Safari 7中的无效日期
这个后备案例是你的约会日期。