当使用下面的调用在JavaScript中初始化一个新的Date对象时,我发现month参数从0开始计数。

new Date(2010, 3, 1);  // that's the 1st April 2010!

为什么month参数从0开始?另一方面,月份的日期参数(最后一个)是1到31之间的数字。有什么好的理由吗?


当前回答

除了月份的第一天之外,其他都是以0为基础的,请参阅这里的完整列表,包括范围:)

实际上,这里以1为基础的天数才是奇怪的……奇怪的是。为什么要这么做?我不知道……但可能发生在同一次会议上,他们喝得烂醉,决定分号是可选的。

其他回答

他们可能认为月份是一个枚举(第一个索引为0),而日期不是,因为它们没有关联的名称。

或者更确切地说,他们认为这一天的数字就是这一天的实际表示形式(就像在12/31这样的日期中用数字表示月份一样),就好像你可以用数字作为变量进行枚举,但实际上是以0为基础的。

所以实际上,对于月份,也许他们认为正确的枚举表示应该是使用月份的名称,而不是数字,如果日期有名称表示,他们也会这样做。想象一下,如果我们说1月5日、1月6日,而不是1月5日、1月6日等等,那么他们可能也会做一个以0为基础的天数枚举……

也许在潜意识里,他们想到了月份的枚举{一月,二月,……}和天数为{1,2,3,…},除非你以数字而不是名称的形式访问日期,比如1代表1,等等,所以不可能从0开始…

在java中也是这样的。可能是为了将int转换为字符串(0 - jan,, 1-feb),他们这样编码..因为它们可能有一个字符串数组(索引从0开始)的月份名称和这些月份数字,如果他们从0开始,它将更容易映射到月份字符串。

这可能是一个缺陷,但当你想将月份或星期表示为字符串时,它也非常方便,你可以创建一个像['jan,'feb'…等][新日期().getMonth()]的[2月”、“简”……[new Date().getMonth()]或['jan','feb'…]等][新日期().getMonth () (1)

月份中的天数通常没有命名,因此您不会为这些日期创建具有名称的数组。在这种情况下,1-31更容易处理,所以你需要每次都减去1…

一年总是有12个月,所以早期的C实现可能使用一个静态的固定宽度数组,索引为0..11。

除了月份的第一天之外,其他都是以0为基础的,请参阅这里的完整列表,包括范围:)

实际上,这里以1为基础的天数才是奇怪的……奇怪的是。为什么要这么做?我不知道……但可能发生在同一次会议上,他们喝得烂醉,决定分号是可选的。