【问题标题】:why does javascript getMonth count from 0 and getDate count from 1?为什么 javascript getMonth 从 0 开始计数,而 getDate 从 1 开始计数?
【发布时间】:2013-04-03 22:40:44
【问题描述】:

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

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

0 = January
1 = February 
...

但是当您调用getDate() 时,它会从 1 开始计数

1 = 1
2 = 2
... 

为什么不一致?

【问题讨论】:

  • 但 getDate() 返回月份中的某天,而不是月份...
  • 然后再次 getDay() 返回星期几(从 0 到 6)...
  • 我猜是因为一个月中的某一天实际上是一个,其中月份更像是一个可枚举类型(例如,您可能希望将其映射到月份名称数组)。但也可能只是 JavaScript 中的日期是一团糟,永远无法更改。
  • 好问题。但我不认为有一个有意义的答案,事情就是这样。
  • 这在构造函数 new Date(2017, 1, 1) 中最容易混淆,即 2017 年 2 月 1 日。

标签: javascript date


【解决方案1】:

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

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 

【讨论】:

  • 这如何解释为什么.getDate()1 开头?
  • 他问的是.getDate(),而不是.getDay()
  • javascript 如果真的是因为这个原因而制作的,那就糟透了。对我来说,这样做会更容易: var months=['', 'Jan', ...];记住 getMonth 可以返回 0。
  • @Stanislav 很多语言都是这样的……JavaScript 不是第一个
  • 这是什么日语……? :)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果您想说它不一致 - 您需要询问语言规范的创建者。据此pageJavaScript 是基于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"
    ]
    

    【讨论】:

    【解决方案4】:

    Link1

    日期.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  
    

    正如“SomeShinyObject”所解释的那样,

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

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

    因此getDaygetHoursgetMonths 从 0 开始。

    【讨论】:

    • 我不明白您所说的以毫秒数表示的日期或发现两个日期之间的差异与这个问题有什么关系。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2015-10-01
    • 2018-11-18
    • 2021-10-10
    相关资源
    最近更新 更多