为什么 JavaScript 的 Date 构造函数中月份参数的范围是 0 到 11?

2024-01-05

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

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

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


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

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

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

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

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

这发生在 1995 年,当时 JDK 1.0 还处于测试阶段。它于 1996 年推出。1997 年,JDK 1.1 发布,弃用了 JDK 上的绝大多数功能。java.util.Date,将它们移至java.util.Calendar,但即便如此,仍然有从零开始的月份。开发人员对此感到厌倦,创建了乔达时间 http://www.joda.org/joda-time/图书馆,最终导致java.time嵌入到 Java 8 (2014) 中的包。

简而言之,Java 花了 18 年的时间才获得了正确设计的内置日期/时间 API,但 JavaScript 仍然停留在黑暗时代。我们确实有优秀的图书馆,比如Luxon https://moment.github.io/luxon/ Moment.js http://momentjs.com/, date-fns https://date-fns.org/, js-joda https://js-joda.github.io/js-joda/, 和别的。但截至目前,也没有什么办法了Date内置于语言中。希望这会在不久的将来改变TC39 临时提案 https://tc39.es/proposal-temporal/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JavaScript 的 Date 构造函数中月份参数的范围是 0 到 11? 的相关文章

随机推荐