79

这个问题纯粹是为了满足我的好奇心。

在 JavaScript Date 对象中,当您调用getMonth()它时会返回月份,但它从 0 开始计数。

0 = January
1 = February 
...

但是当你打电话时,getDate()它从 1 开始计数

1 = 1
2 = 2
... 

为什么不一致?

4

4 回答 4

77

我认为这是因为在名称数组中引用它会更容易,即

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 
于 2013-04-03T22:45:38.033 回答
3

有点晚了,但正确的答案在这里:

https://stackoverflow.com/a/41992352/134120

他们(JavaScript 的创建者)从 Java 中的相应类中复制了功能(这又似乎是从 C 中复制的)。所以我们在传播过去的错误‍♂️</p>

于 2021-07-20T09:51:31.827 回答
0

如果你想说它不一致 - 你需要询问语言规范的创建者。根据这个页面 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"
]
于 2013-04-03T23:04:46.547 回答
0

链接1

Date.prototype.getDate()
根据本地时间返回指定日期的月份日期 (1-31)。

链接2

Date 对象包含一个数字,该数字表示在毫秒内的特定时刻。例如,如果您指定 150 秒,JavaScript 会将该数字重新定义为 2 分 30 秒。

当您在 Javascript 中实现方法以查找以毫秒为单位指定的两个时间之间的差异时,您需要返回 a 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 开始。

于 2017-04-27T03:10:59.323 回答