【问题标题】:Creating date with numbers (new Date(2012, 03, ...) gives wrong month (+1)用数字创建日期 (new Date(2012, 03, ...) 给出错误的月份 (+1)
【发布时间】:2012-05-18 08:10:38
【问题描述】:

当使用零件的数字创建new Date 对象时,我得到的值恰好比我为“月”输入的值提前一个月。

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 提出的问题:Why is January month 0 in Java Calendar?

为什么会这样?

【问题讨论】:

  • 值得注意的是,05实际上是一个八进制数。幸运的是八进制 5 == 十进制 5。
  • 另外,只是为了引用一些官方的东西:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…。月份:“表示月份的整数值,从 0 开始表示一月到 11 表示十二月。”
  • 谢谢@corbin。我抓住了这一点,但没有将其包含在示例中。我们对来自 .net 的内容进行格式化的标准方法是 MM,所以它被忽略了。幸运的是我不是 09 :)
  • 实际上,由于 09 不是有效的八进制,我相信 09 === 9 (基本上作为'oops'后卫)。除非您尝试执行 011 或 012,否则 0 确实是无害的。并不是真的要理解为更正,而只是一个旁注:)
  • 啊 :) 我从没试过 09,不知道。我不怎么做JS。

标签: javascript


【解决方案1】:

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

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

From MDN:

月

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

【讨论】:

  • 啊,有我要找的参考资料。谷歌搜索这些信息组合并没有帮助。但是对于 FFS,地球 上谁认为这会不那么 令人困惑? 人虽然从 1 开始计数,但我从未见过任何一种库可以做到这一点,从 basic 到 java 到 ruby​​ 到 perl,再到现在的 c#。叹。是的,我是一名程序员,我认为这就是原因,但它看起来很愚蠢。
  • 老实说,我猜这只是内部的一种便利,可以让创建日期对象时的数学运算更容易。否则没有理智的理由。到目前为止,我一直将日期写为秒并转换为(日期),所以我从来没有注意到这一点。
  • 我不明白为什么天不遵守规则。我认为这只是 javascript 的众多设计缺陷之一。
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2017-06-08
相关资源
最近更新 更多