为什么在 JavaScript 的 Date 构造函数中 month 参数的范围从 0 到 11?

2022-08-30 01:03:22

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

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

为什么 month 参数从 0 开始?另一方面,月中的某一天参数(最后一个)是从 1 到 31 的数字。这有充分的理由吗?


答案 1

这个问题的真正答案是,它是从 复制的,它也有这个怪癖。证据可以在Twitter上找到Brendan Eich - 最初实现JavaScript的人:java.util.Date

https://twitter.com/BrendanEich/status/481939099138654209

First Tweet, which says: "In case it helps (it doesn't for most), JS's Date is a copy of Java's JDK1.0 (1995) java.util.Date.  Made it look like Java..."

https://twitter.com/BrendanEich/status/771006397886533632

Second Tweet, which says: "We were under "Make It Look Like Java" mgmt orders, and I had ten days to demo.  No time to invent our own date API or even fix Java's."

Brendan还表示,是Netscape的Ken Smith从Java进行了移植。

https://twitter.com/BrendanEich/status/771006208949891072

Third Tweet, which says: "Only Mocha src file I didn't create was mo_date.c: Ken Smith of Netscape helped me translate java.util.Date from Java to C."

这发生在1995年,JDK 1.0处于测试阶段。它于1996年推出。1997年,JDK 1.1问世,弃用了绝大多数功能,将它们转移到 ,但即使这样仍然有零基月。受够了的开发人员创建了Joda-Time库,最终导致了Java 8(2014)的软件包。java.util.Datejava.util.Calendarjava.time

简而言之,Java花了18年的时间才获得一个正确设计的日期/时间API内置,但JavaScript仍然停留在黑暗时代。我们确实拥有优秀的库,如Luxon Moment.jsdate-fnsjs-joda等。但截至目前,该语言只不过是内置的。希望在不久的将来,随着 TC39 时间提案的提出,这种情况会有所改变。Date


答案 2

这是编程世界中一个古老的(可能是不幸的,可能正在消亡的)传统,请参阅旧标准(POSIX)localtime C函数 http://linux.die.net/man/3/localtime