为什么javascript getMonth从0开始计数,getDate从1开始计数?

时间:2013-04-03 22:40:44

标签: javascript date

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

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

0 = January
1 = February 
...

但是当你致电getDate()时,它会从1

开始计算
1 = 1
2 = 2
... 

为什么不一致?

4 个答案:

答案 0 :(得分:56)

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

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 

答案 1 :(得分:2)

如果你想说它不一致 - 你需要询问语言规范的创建者。根据此page JavaScript基于ECMAScript(编辑:请参阅@MichaelGeary评论)。

当您从第165页here阅读时,您会发现所有内容都与其设计完全一致。

对你而言,它可能是不一致的。对我而言,这是一个功能 - 基于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"
]

答案 2 :(得分:0)

Link1

  

Date.prototype.getDate()
      根据当地时间返回指定日期的月中某天(1-31)。

Link2

  

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  

正如#34; SomeShinyObject"

var months = ["January", "February", "March", "April", "May", "June", "July",
         "August", "September", "October", "November", "December"];

有助于通过数组索引引用它们。

因此getDaygetHoursgetMonths从0开始。

答案 3 :(得分:0)

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

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

他们(JavaScript 的创建者)从 Java 中的相应类(反过来似乎是从 C 中复制而来)复制了功能。所以我们在传播过去的错误?‍♂️