用数字创建日期(new Date(2012, 03, ...) 给出错误的月份 (+1)

IT技术 javascript
2021-02-28 03:01:28

当创建一个new Date使用号码为部分对象,我回来的值精确1个月未来我把在“月”的value。

new Date(2012, 05, 17, 00, 00, 00)
Sun Jun 17 2012 00:00:00 GMT+0800 (HKT)  // june?!

但是,完全相同字符串的正常解析会返回正确的时间:

new Date("2012-05-17 00:00:00")
Thu May 17 2012 00:00:00 GMT+0800 (HKT)

我在 ie/ff/chrome 中得到相同的结果。删除小时/分钟/秒没有任何效果。我可以通过在设置月份之前减去一个来解决这个问题,但我只是切换到将我的日期写成一个字符串。

编辑: 字符串解析在 IE 中不起作用。我不知道我做了什么,但我发誓我做到了。那是概率。为什么我首先避免它。我现在已经改用moment.js。

啊,现在我明白了。就像常规的 Java 日期一样,我不会在其中编码,除非很少,甚至总是使用库(joda 等)。无论如何,这是一个多么糟糕的主意。这是 skeets 对这个问题的看法:为什么 Java 日历中的 1 月是 0?

为什么会这样?

1个回答

程序员从 0 开始计数。所以月份用 0(Jan)-11(Dec) 表示。

天数不遵循此规则的原因是不要将作者与 30/31 个月的差异混淆。

来自 MDN:

表示月份的整数值,从 0 开始表示一月到 11 表示十二月。

老实说,我猜这只是在内部方便的事情,使创建日期对象时的数学计算更容易。否则没有合理的理由。到目前为止,我总是将日期写为秒并转换为(日期),所以我从未注意到这一点。
2021-05-02 03:01:28
我不明白为什么天不遵守规则。我认为这只是 javascript 中众多设计缺陷之一。
2021-05-09 03:01:28
啊,有我正在寻找的参考。谷歌搜索这种信息组合无济于事。但对于FFS,谁在大地认为这将是混淆? 虽然人们从 1 开始计数,但我从来没有见过一个库这样做,从基本到 Java 到 ruby​​ 到 perl,到现在的 C#。叹。是的,我是一名程序员,我想这就是原因,但这似乎很愚蠢
2021-05-13 03:01:28