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

在转换为日期对象时,为什么在JavaScript中从月份中减去1?,javascript,datetime,date,Javascript,Datetime,Date,可能重复: 我正在读的书中有这样的解释:“嗯,我姨妈开始像其他人一样从1开始计算她的月份,所以我们减去1 以下是输入字符串日期:“死于2006年4月27日:黑色莱克莱尔” 代码如下: function extractDate(paragraph) { function numberAt(start, length) { return Number(paragraph.slice(start, start + length)); } return new Date(numbe

可能重复:

我正在读的书中有这样的解释:“嗯,我姨妈开始像其他人一样从1开始计算她的月份,所以我们减去1

以下是输入字符串日期:
“死于2006年4月27日:黑色莱克莱尔”

代码如下:

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的后续必要性。请解释。

JavaScript日期对象中表示的月份是基于0的。也就是说,一月表示为
0
,二月表示为
1
,三月表示为
2
,等等

有关为何跨多种语言实现此行为的一些有趣答案,请参阅

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


JavaScript日期对象中表示的月份是基于0的。也就是说,一月表示为
0
,二月表示为
1
,三月表示为
2
,等等

有关为何跨多种语言实现此行为的一些有趣答案,请参阅

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


我认为它这样做的技术原因是因为month是一个枚举字段,这意味着它可以映射到一个由月份名称组成的数组,数组从零开始计数,而年份和天数则不枚举;您总是只需要实际的数值,所以这就是存储的内容

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


顺便说一句,如果您正在处理日期,特别是从字符串中提取日期并将其格式化为字符串,您可能需要研究一下,这是一个javascript库,可以对所有这类事情有很大帮助。

我认为它这样做的技术原因可能是因为月份是一个枚举字段,这意味着它可以映射到一个月名称数组,数组从零开始计数,而年和天则不枚举;您总是只需要实际的数值,所以存储的就是这个数值

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


顺便说一句,如果您正在处理日期,特别是从字符串中提取日期并将其格式化为字符串,您可能需要研究一下,这是一个javascript库,可以帮助您处理所有这类事情。

阿姨从一开始计数,而阿姨从0开始计数。请参阅:@Yoshi为什么计算mo时从0开始N但从1开始计算年份?天哪。那太荒谬了。他们为什么要这么做?这是基督教日历。几个月都没有0。他们应该为那一个断开互联网,依我看。我不敢相信作者只是像预期的那样漠不关心地把它扔出去。好吧,谢谢各位。我想这是因为这个月范围是固定的(12个要素),而年份范围是两端开放的(理论上)。正如Yoshi所建议的,Javascript对月份0-11进行编号,0为1月。因此,如果输入为04,则日期输出对象为May,如果输入为03,则日期对象输出为April。阿姨从1开始计数,而阿姨从0开始计数。请参阅:@Yoshi为什么计数月份时从0开始,而计数yea时从1开始rs?哦,天哪。那太荒谬了。他们为什么要这样做?这是基督教日历。几个月没有0。他们应该为这一个断开互联网,依我看。我不敢相信作者只是像预期的那样漠不关心地把它扔出去。好吧,谢谢各位。我想这是因为月份范围是固定的(12个元素),而年份范围对两端开放(理论上)。正如Yoshi所建议的那样,Javascript将月份编号为0-11,0为1月。因此,如果输入为04,则日期输出对象为May,如果输入为03,则日期对象输出为April。