2017-03-02 87 views
1

我知道了一个月,因为索引零一个月,对于日期当处于日期对象零索引

Thu Mar 02 2017 

我必须写

new Date(2017, 2, 2); 

同样的,如果我使用一个变量

var thismonth = 2; new Date(2017, thismonth, 2); 

但是,如果我说

var thisday = [2017, 2, 2]; new Date(thisday); 

我得到一个结果的一个索引一个月

Thu Feb 02 2017 

这意味着,我可以使用数组瓦尔像日期瓦尔在现实生活中

var thisday = [2017, 3, 2]; new Date(thisday); 

,并得到(联合国)预期结果

Thu Mar 02 2017 

这很好,但令人困惑!为什么会这样?有规则吗?

回答

0

我不认为代码做什么,你认为它。 Date构造函数不接受数组。引用spec

让v是? ToPrimitive(值)。

如果Type(v)为字符串,然后

设电视是解析V作为一个日期,以完全相同的方式作为用于解析方法(20.3.3.2)的结果。如果解析导致突然完成,则电视是完成记录。

这意味着你实际上将2017,3,2作为字符串传递。现在该字符串发生了什么?那么再次检查spec

否则,parse会将结果字符串解释为日期和时间;它会返回一个数字,即与日期和时间对应的UTC时间值。根据字符串的内容,字符串可能被解释为本地时间,UTC时间或某个其他时区的时间。函数首先尝试根据日期时间字符串格式(20.3.1.16)中规定的规则(包括扩展年份)来解析字符串的格式。

有趣的是,另一个链接到spec

您的格式不符合YYYY-MM-DDTHH:mm:ss.sssZ格式或日期仅YYYY-MM-DD这意味着我们又回到了以前的规范部分它说

如果字符串不符合该格式的功能可能回落到任何具体的实施启发式或实现特定的日期格式。

所以基本上你不应该依赖于它。根据JS引擎/浏览器的不同,日期可能不会被解析。它看起来像V8接受不仅冒号/破折号作为分隔符,也逗号,这就是为什么它的工作原理。

编辑:发现

https://github.com/v8/v8/blob/68960eeb763f93dcedb37d5b663b1019192b7f36/src/builtins/builtins-date.cc#L115

这就要求

https://github.com/v8/v8/blob/68960eeb763f93dcedb37d5b663b1019192b7f36/src/dateparser-inl.h#L16

其中有大量的意见和怪异的东西,以保持如果你想搜索。