为什么在转换为日期对象时,在JavaScript中减去1个月?

时间:2011-10-20 10:02:24

标签: javascript datetime date

  

可能重复:
  Zero-based month numbering

我正在阅读的书中的解释说:“好吧,我的姨妈从其他人开始计算她的月数,所以我们减去1。

这是输入字符串日期:"died 27/04/2006: Black Leclère"

以下是代码:

function extractDate(paragraph) {
  function numberAt(start, length) {
    return Number(paragraph.slice(start, start + length));
  }
  return new Date(numberAt(11, 4), numberAt(8, 2) - 1,
                  numberAt(5, 2));
}

alert(extractDate("died 27-04-2006: Black Leclère"));

04 - 1是03.但这是输出日期对象:Thu Apr 27 2006 00:00:00

知道我们想要输出的内容并不能解释语言的异常行为以及-1的后续必要性。请解释一下。

2 个答案:

答案 0 :(得分:4)

JavaScript中表示的月份日期对象从0开始。也就是说,1月代表0,2月代表1,3月代表2等。

有关为何在多种语言中实施此行为的一些有趣答案,请参阅Zero-based month numbering

  

“基于零的数组和基于1的月份值的组合确实带来了问题。要获得月份9的月份名称,您必须从月份数组中获取第8项。一些开发人员将是在获得它的名字之前减少月份数字感到高兴。其他人更喜欢将月份改为零基础,因为人们只想知道名字,而不是数字。这是个人观点。“

答案 1 :(得分:1)

我认为它的技术原因是因为month是一个枚举字段,这意味着它可以映射到月份名称数组,并且数组从零开始计数,而数字和日期不会被枚举;你总是只想要实际的数字值,这就是存储的内容。

这是一个非常有效的问题,因为如果你使用月份作为数字,那么它看起来有点奇怪(更不用说容易忘记了)。

顺便说一句,如果您正在使用日期,特别是从字符串中提取日期并将其格式化为字符串,您可能需要查看Date.js,这是一个可以帮助所有人的javascript库这种事。