2017-01-31 28 views
1

我无法理解为什么javascript给出的有效日期等于1 dec给出无效日期的日期?这种行为是否由于特定原因而被纳入语言中?因为它必须是无效的日期我的使用情况 新的日期(“2017年11月31日”)有效日期来自invalida日期的输出Javascript

+0

我从来没有能够学习Date构造函数解析器的所有规则和异常。你确定它应该总是拒绝美国格式的日期吗? –

+0

http://stackoverflow.com/questions/8098202/javascript-detecting-valid-dates – msg

回答

1

首先,在Date constructor没有设计验证输入,甚至是挑剔。相反,它是明确设计不惜任何代价,以创建一个实例,像这样的创意规则:

当日期被称为具有一个以上参数的构造,如果 值低于其合理的范围更大(例如提供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不符合 标准格式的功能可能回落到任何 implementation-具体的启发式算法或实现特定的解析算法。无法识别的字符串或包含ISO格式字符串中的非法元素 值的日期应导致Date.parse()返回 NaN。

// Non-ISO string with invalid date values 
new Date('23/25/2014'); 

将:

然而,由ECMA-262所定义的可能或可能不导致NaN时,取决于 浏览器和值提供,例如在日期字符串无效的值不被识别为ISO格式 在Safari 7

被视为2015年11月25日,在火狐30和 无效的日期本地日期此回退的情况下是一个你的约会落入。