Date
使用以下调用在JavaScript中初始化新对象时,我发现month参数从零开始计数。
new Date(2010, 3, 1); // that's the 1st April 2010!
为什么month参数从0开始?另一方面,每月的天参数(最后一个)是1到31之间的数字。这是否有充分的理由?
the Day of the week (integer)
0-6
Date
使用以下调用在JavaScript中初始化新对象时,我发现month参数从零开始计数。
new Date(2010, 3, 1); // that's the 1st April 2010!
为什么month参数从0开始?另一方面,每月的天参数(最后一个)是1到31之间的数字。这是否有充分的理由?
the Day of the week (integer)
0-6
Answers:
在编程世界中,这是一种古老的(可能是不幸的,也许正在消亡)的传统,请参见古老的标准(POSIX)本地时间 C函数http://linux.die.net/man/3/localtime
Date
对象是从Java 1.0移植的,这就是为什么。继承其所有的缺陷... stackoverflow.com/questions/344380/...
这个问题的真正答案是,它是从复制的java.util.Date
,也有这个怪癖。可以在Twitter上从Brendan Eich那里找到证明-Brendan Eich是最初实现JavaScript(包括Date
对象)的人:
https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
这发生在1995年,并且JDK 1.0处于测试版。它于1996年启动。1997年,JDK 1.1出现了,该版本不推荐使用上的绝大多数功能java.util.Date
,将其移至java.util.Calendar
,但即使这样,其功能也从零开始。开发人员厌倦了这一点,创建了Joda-Time库,最终将其java.time
打包到Java 8(2014)中。
简而言之,Java花费了18年的时间才获得了正确设计的内置日期/时间API,但是JavaScript仍然处于黑暗时代。实际上,我们确实有出色的库,例如Moment.js,date -fns和js-joda。但是截至目前,Date
该语言仅是内置的。希望这会在不久的将来改变。
除月中的某天外,其他所有内容都基于0,请参见此处以获取包含范围的完整列表:)
实际上,这是从1开始的日子,这很奇怪。为什么要这样做?我不知道...但是可能是在他们碰面的同一次会议上发生的,并决定分号是可选的。
{ "first", "second", "third", ..., "twenty-seventh", ... }
)并尝试通过对其进行索引tm_mday
。再说一遍,也许他们只是看到了绝对的效用,可以使一次正常的错误消除。
一年中总是有12个月,因此早期的C实现可能使用索引为0..11的静态固定宽度数组。
我知道这并不是对原始问题的真正答案,但我只是想向您展示我对这个问题的首选解决方案,由于它不时出现,所以我似乎从未记住。
较小的功能zerofill可以在需要的地方完成零填充的技巧,并且仅+1
添加了月份:
function zerofill(i) {
return (i < 10 ? '0' : '') + i;
}
function getDateString() {
const date = new Date();
const year = date.getFullYear();
const month = zerofill(date.getMonth()+1);
const day = zerofill(date.getDate());
return year + '-' + month + '-' + day;
}
但是,是的,Date具有非常直观的API,当我阅读Brendan Eich的Twitter时我很开心。
他们可能认为月份是一个枚举(第一个索引为0),而几天则不是,因为它们没有关联的名称。
或更确切地说,他们认为日期是日期的实际表示形式(以12/31之类的日期表示月份的方式相同),好像您可以使用数字作为变量进行枚举,但实际上从0开始。
因此,实际上,在几个月中,也许他们认为正确的枚举表示形式将是使用月份的名称而不是数字,并且如果日子使用名称表示,他们也会这样做。想象一下,如果我们说是1月5日,1月6日,而不是1月5日,1月6日等,那么也许他们也做了几天从0开始的枚举...
也许在潜意识里,他们想到了一个枚举为{{January,February,...}}几个月,几天为{One,Two,Three,...}的枚举,除了几天以数字而不是名称来访问的日子,例如1对1等,因此不可能从0开始...
这可能是一个缺陷,但是当您想将月份或星期几表示为字符串时,也可以非常方便使用,您可以创建一个数组,例如['jan,'feb'... etc] [new Date() .getMonth()]代替['','jan',feb ... etc] [new Date()。getMonth()或['jan','feb'... etc] [new Date( ).getMonth()-1]
通常不会指定一个月中的某几天,因此您将不会使用这些名称创建数组。在这种情况下,1-31更易于处理,因此您每次必须减去1 ...