MomentJS - isValid()方法未正确验证

时间:2015-12-03 18:19:44

标签: javascript angularjs validation momentjs

我正在阅读MomentJS的文档,以验证从String创建的时刻日期。

他们给出的例子是:

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

但是如果我在String的末尾添加1并验证它,我得到:

2) moment("not a real date 1").isValid(); // true

为什么#2是有效的时刻日期对象?

1 个答案:

答案 0 :(得分:3)

请注意,该构造函数现在是deprecated。但要回答这个问题:

此构造函数转向并将"not a real date 1"字符串传递给Date构造函数。看看这个:

在Chrome中:

new Date("not a real date 1") --> Mon Jan 01 2001 00:00:00 GMT-0600 (Central Standard Time)
new Date("not a real date")   --> Invalid Date

在IE11中:

new Date("not a real date 1") --> [date] NaN[date] NaN
new Date("not a real date")   --> [date] NaN[date] NaN

在FireFox 42中:

new Date("not a real date 1") --> Invalid Date
new Date("not a real date")   --> Invalid Date

答案是, 正确验证,并且它是一个有效的日期对象,因为Date构造函数成功创建了一个Date对象。 Date构造函数中存在一个错误,至少在某些浏览器中是这样。

修改:

这里是ECMAScript 6 spec的相关部分,强调我的:

  

如果Type(v)是String,那么   设tv是将v解析为日期的结果,其方式与解析方法(20.3.3.2)完全相同。如果解析导致突然完成,则tv是完成记录。

然后,20.3.3.2部分:

  

该函数首先尝试根据日期时间字符串格式(20.3.1.16)中调用的规则(包括延长年份)来解析字符串的格式。 如果字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。无法识别字符串或包含格式为String的非法元素值的日期将导致日期。解析返回NaN。

因此,由于规范明确允许浏览器创造性地解析字符串,我猜它不是一个错误。 Chrome的行为与其他行为不同。