这个问题纯粹是为了满足我的好奇心。
在 JavaScript Date 对象中,当您调用
getMonth()
时,它会返回月份,但从 0 开始计数。
0 = January
1 = February
...
但是当你调用
getDate()
时,它会从1开始计数
1 = 1
2 = 2
...
为什么会不一致?
我认为这是因为在名称数组中引用会更容易,即
var months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
var d = new Date();
var namedMonth = months[d.getMonth()];
如果
getMonth()
返回 1-12
,那么程序员每次想要一个奇特的命名月份时都必须做 d.getMonth()-1
。
一个月中的日子本身没有特定的“名称”。
getDate()
返回 1-(28-31)
。我们通常只用编号来引用它们。
与
getMonth()
相同的概念也适用于 getDay()
,它根据星期几返回 0-6
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var namedDay = days[d.getDay()];
所有这些都会返回类似:
console.log("Month: month[" + d.getMonth() + "]: " + namedMonth);
//Month: month[3]: April
console.log("Day: days[" + d.getDay() + "]: " + namedDay);
// Day: days[4] : Thursday
来得有点晚了,但正确的答案在这里:
https://stackoverflow.com/a/41992352/134120
他们(JavaScript 的创建者)从 Java 中相应的类复制了功能(而 Java 又似乎是从 C 复制的)。所以我们正在传播过去的错误🤦u200d♂️
如果你想说这是不一致的——你需要询问语言规范的创建者。根据这个page
JavaScript
基于ECMAScript
(编辑:参见@MichaelGeary评论)。
当您阅读第 165 页此处时,您会发现一切都按照设计运行。
对你来说这可能是不一致的。对我来说,这是一个功能 - 基于 0 的值让您可以立即访问
Array
而无需进行计算(请参阅@Christopher 的答案)。如果是一个月中的某一天,您将无法真正访问任何Array
。如果有 Array
的月份名称会很奇怪......像这样:
var namesOfDays = [
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", // and again at least 4 times ...
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
"Sunday", "Monday", "Tuesday"
]
Date.prototype.getDate()
根据当地时间返回指定日期的月份(1-31)中的第几天。
Date 对象包含一个代表特定时刻的数字 时间控制在毫秒以内 例如,如果您指定 150 秒,JavaScript 会将该数字重新定义为 2 分 30 秒。
当您在 Javascript 中实现方法来查找以毫秒为单位指定的两个时间之间的差异时,您需要返回一个
date
,出于显而易见的原因,它需要为 greater than 0
。
var startTime = new Date('1/1/1990');
var startMsec = startTime.getMilliseconds();
startTime.setTime(5000000);
var elapsed = (startTime.getTime() - startMsec) / 1000;
document.write(elapsed);
// Output: 5000
正如“SomeShinyObject”所解释的那样
var months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
有助于通过数组索引引用它们。
因此
getDay
、getHours
、getMonths
从0开始。
console.log(new Date().toLocaleString('default', { month: 'long' }));
第一个示例输出月份编号(1 表示一月,2 表示二月等),第二个示例输出完整的 月份名称。