使用JavaScript确定一个月内的天数的最佳方法是什么?

时间:2008-11-24 22:41:05

标签: javascript date

我一直在使用这个功能,但我想知道最有效和最准确的方法是什么。

function daysInMonth(iMonth, iYear) {
   return 32 - new Date(iYear, iMonth, 32).getDate();
}

15 个答案:

答案 0 :(得分:172)

function daysInMonth (month, year) { // Use 1 for January, 2 for February, etc.
  return new Date(year, month, 0).getDate();
}

console.log(daysInMonth(2, 1999)); // February in a non-leap year.
console.log(daysInMonth(2, 2000)); // February in a leap year.

第0天是上个月的最后一天。因为月构造函数是从0开始的,所以这很好用。有点黑客,但这基本上是你通过减去32来做的。

答案 1 :(得分:8)

如果经常调用此函数,则缓存该值以获得更好的性能可能很有用。

以下是FlySwat's answer的缓存版本:

var daysInMonth = (function() {
    var cache = {};
    return function(month, year) {
        var entry = year + '-' + month;

        if (cache[entry]) return cache[entry];

        return cache[entry] = new Date(year, month, 0).getDate();
    }
})();

答案 2 :(得分:5)

一些答案​​(也在其他问题上)有闰年问题或使用日期对象。虽然javascript的Date object涵盖1970年1月1日左右的大约285616年(100,000,000天),但我厌倦了不同浏览器的各种意外日期inconsistencies(最值得注意的是0年级)至99)。我也很好奇如何计算它。

所以我写了一个简单的,最重要的,算法来计算正确Proleptic Gregorian / Astronomical / ISO 8601:2004 (第4.3.2.1条),因此year 0存在并且是闰年,支持负数年)给定月份和年份的天数。
它使用short-circuit bitmask-modulo leapYear algorithm(略微修改为js)和常见的mod-8月算法。

请注意,在AD/BC表示法中,年份0 AD / BC不存在:相反年份1 BC是闰年!
如果您需要考虑BC符号,那么只需减去一年(否则为正)年值! (或者从1中减去年份以进行进一步的年度计算。)



function daysInMonth(m, y){
  return m===2?y&3||!(y%25)&&y&15?28:29:30+(m+(m>>3)&1);
}

<!-- example for the snippet -->
<input type="text" value="enter year" onblur="
  for( var r='', i=0, y=+this.value
     ; 12>i++
     ; r+= 'Month: ' + i + ' has ' + daysInMonth(i, y) + ' days<br>'
     );
  this.nextSibling.innerHTML=r;
" /><div></div>
&#13;
&#13;
&#13;

注意,月份必须从1开始!

注意,这是一个不同的算法,然后是我在Javascript calculate the day of the year (1 - 366)答案中使用的幻数查找,因为这里闰年的额外分支仅在二月份才需要。

答案 3 :(得分:3)

为了消除混淆,我可能会将月份字符串设置为当前基于1的字符串。

function daysInMonth(month,year) {
    monthNum =  new Date(Date.parse(month +" 1,"+year)).getMonth()+1
    return new Date(year, monthNum, 0).getDate();
}

daysInMonth('feb', 2015)
//28

daysInMonth('feb', 2008)
//29

答案 4 :(得分:2)

使用{{3}},您可以使用daysInMonth()方法:

IOCTL_WRAPPER(RetVal, 1, 2, 3);

答案 5 :(得分:2)

ES6语法

const d = (y, m) => new Date(y, m, 0).getDate();

返回

console.log( d(2020, 2) );
// 29

console.log( d(2020, 6) );
// 30

答案 6 :(得分:1)

单线程直接计算(无日期对象):

&#13;
&#13;
function daysInMonth(m, y) {//m is 1-based, feb = 2
   return 31 - (--m ^ 1? m % 7 & 1:  y & 3? 3: y % 25? 2: y & 15? 3: 2);
}

console.log(daysInMonth(2, 1999)); // February in a non-leap year
console.log(daysInMonth(2, 2000)); // February in a leap year
&#13;
&#13;
&#13;

基于0的月份的变化:

function daysInMonth(m, y) {//m is 0-based, feb = 1
   return 31 - (m ^ 1? m % 7 & 1:  y & 3? 3: y % 25? 2: y & 15? 3: 2);
}

答案 7 :(得分:1)

如果您想要Date对象当前月份的天数,请考虑以下方法:

Date.prototype.getNumberOfDaysInMonth = function(monthOffset) {
    if (monthOffset !== undefined) {
        return new Date(this.getFullYear(), this.getMonth()+monthOffset, 0).getDate();
    } else {
        return new Date(this.getFullYear(), this.getMonth(), 0).getDate();
    }
}

然后你可以像这样运行它:

var myDate = new Date();
myDate.getNumberOfDaysInMonth(); // Returns 28, 29, 30, 31, etc. as necessary
myDate.getNumberOfDaysInMonth(); // BONUS: This also tells you the number of days in past/future months!

答案 8 :(得分:1)

单行:

foreach($_COOKIE as $key=>$val) {
    $piece = explode(",", $val);
    $t_cost = array($piece[3]);
    print_r($t_cost); //It prints Array ( [0] => 11 ) Array ( [0] => 11 )
    echo $total_cost = array_sum($t_cost);
}

答案 9 :(得分:1)

这就是去

new Date(2019,2,0).getDate(); //28
new Date(2020,2,0).getDate(); //29

答案 10 :(得分:1)

与选择的答案相比,可能会有点杀人:)但是这里是:

function getDayCountOfMonth(year, month) {
  if (month === 3 || month === 5 || month === 8 || month === 10) {
    return 30;
  }

  if (month === 1) {
    if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) {
      return 29;
    } else {
      return 28;
    }
  }

  return 31;
};

console.log(getDayCountOfMonth(2020, 1));

我在上面找到了上面的代码:https://github.com/ElemeFE/element/blob/dev/src/utils/date-util.js

function isLeapYear(year) { 
  return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); 
};

const getDaysInMonth = function (year, month) {
  return [31, (isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};

console.log(getDaysInMonth(2020, 1));

我在上面找到了上面的代码:https://github.com/datejs/Datejs/blob/master/src/core.js

答案 11 :(得分:1)

如果您要传递日期变量,这可能会有所帮助

const getDaysInMonth = date =>
  new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();

daysInThisMonth = getDaysInMonth(new Date());

console.log(daysInThisMonth);

答案 12 :(得分:0)

function numberOfDays(iMonth, iYear) {
         var myDate = new Date(iYear, iMonth + 1, 1);  //find the fist day of next month
         var newDate = new Date(myDate - 1);  //find the last day
            return newDate.getDate();         //return # of days in this month
        }

答案 13 :(得分:0)

考虑闰年:

function (year, month) {
    var isLeapYear = ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);

    return [31, (isLeapYear ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
}

答案 14 :(得分:-2)

也许不是最优雅的解决方案,但易于理解和维护;而且,它经过了久经考验。

function daysInMonth(month, year) {
    var days;
    switch (month) {
        case 1: // Feb, our problem child
            var leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
            days = leapYear ? 29 : 28;
            break;
        case 3: case 5: case 8: case 10: 
            days = 30;
            break;
        default: 
            days = 31;
        }
    return days;
},