何时将Date对象中的月份归零

时间:2017-03-02 18:22:36

标签: javascript

我知道,因为零索引月份为日期

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

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

2 个答案:

答案 0 :(得分:0)

这是一个有趣的发现!但是没有记录的Date构造函数接受[2017, 3, 2]之类的值数组,因此在这种情况下你得到的不是你应该依赖的东西。

您可以在示例中看到,只记录了第一个: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date

答案 1 :(得分:0)

我不认为代码会按照您的想法执行。 Date构造函数不接受数组。引用spec

  

让v成为? ToPrimitive(值)。

     

如果Type(v)是String,那么

     

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

表示您实际将2017,3,2作为字符串传递。那个字符串会发生什么?好吧,再次检查spec

  

否则,parse会将结果String解释为日期和时间;它返回一个Number,即与日期和时间对应的UTC时间值。 String可以解释为本地时间,UTC时间或某个其他时区的时间,具体取决于String的内容。该函数首先尝试根据日期时间字符串格式(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

有很多评论和奇怪的东西,如果你想继续搜索。