JavaScript Date Object提取天数 - 功能细分

时间:2015-06-28 23:11:55

标签: javascript

简而言之:有人可以向我解释一下这个功能是怎么回事:

function daysInMonth(month, year){
            return new Date(year, month, 0).getDate();
}
alert(daysInMonth(1, 2013));

我真正对理解感兴趣的是,为什么有一个" 0"一个月后?我似乎无法理解它,我已经尝试省略它,并且还用" day"但两者结果不同。这个功能似乎只适用于" 0"在Object中传递。

调用函数时,另一个棘手的部分,传递" 0"和" 1"代表一月两者都返回相同的天数,通过" 12"和" 11"表示12月返回不同的天数(12返回31(12月)和11返回30(11月))。

2 个答案:

答案 0 :(得分:4)

JavaScript日期对象“修复”没有意义的日期设置。在一个月内请求第0天的日期实例,而不是为上一个月中的最后一天提供日期。

月份从零开始编号,但该函数的编写方式就像月份从1开始编号一样。因此,当您将0或1作为月份数字传递时,您会获得相同的答案,因为您获得了月份中的天数12月和1月,这两个月都有31天。

就我个人而言,我不会那样写那个功能;因为有必要记住JavaScript中的月数从零开始编号,我已经编写了这样的函数:

function daysInMonth(month, year){
   return new Date(year, month + 1, 0).getDate();
}

然后要获得1月份的天数,你可以这样称呼它:

var janDays = daysInMonth(0, 2015);

答案 1 :(得分:2)

关键是JS Date对象构造函数。此功能需要多个参数,但需要三个参数:年,月,日。日期参数是该月的日期,该月的第一天编号为1.上面的代码非常棘手。根据JS引用传递0表示日期,实际上是在PREVIOUS月的最后一天。因此,这实际上解释了您的日期问题以及最后的月份问题。

有关详细信息,请参阅:http://www.w3schools.com/jsref/jsref_setdate.asp

传递0和1实际上并不代表1月 - 1代表1月,0代表上一年的12月,也有31天! (尝试在闰日一年后运行此功能,它们将不会有相同的天数。)

编辑:示例 为了更好地掌握实际情况,请尝试运行此功能:

function check() {
    console.log(new Date(2015, 0, 0).toISOString());  // 2014-12-31T08:00:00.000Z
    console.log(new Date(2015, 1, 0).toISOString());  // 2015-01-31T08:00:00.000Z
    console.log(new Date(2015, 11, 0).toISOString());  // 2015-11-30T08:00:00.000Z
    console.log(new Date(2015, 12, 0).toISOString());  // 2015-12-31T08:00:00.000Z
}