What is the best way to determine the number of days in a month with JavaScript?

Viewed 33195

I've been using this function but I'd like to know what's the most efficient and accurate way to get it.

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

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.

Day 0 is the last day in the previous month. Because the month constructor is 0-based, this works nicely. A bit of a hack, but that's basically what you're doing by subtracting 32.

See more : Number of days in the current month

Here is goes

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

May be bit over kill when compared to selected answer :) But here it is:

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));

I found the above code over here: 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));

I found the above code over here: https://github.com/datejs/Datejs/blob/master/src/core.js

ES6 syntax

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

returns

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

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

In a single line:

// month is 1-12
function getDaysInMonth(year, month){
    return month == 2 ? 28 + (year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? 1 : 0) : 1):0) : 31 - (month - 1) % 7 % 2;
}

Perhaps not the most elegant solution, but easy to understand and maintain; and, it's battle-tested.

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;
},

If you are going to pass a date variable this may helpful

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

daysInThisMonth = getDaysInMonth(new Date());

console.log(daysInThisMonth);

One-liner, without using Date objects:

const countDays = (month, year) => 30 + (month === 2 ? (year % 4 === 0 && 1) - 2 : (month + Number(month > 7)) % 2);

returns:

countDays(11,2020) // 30
countDays(2,2020) // 29
countDays(2,2021) // 28

To get the number of days in the current month

var nbOfDaysInCurrentMonth = new Date(Date.UTC(new Date().getUTCFullYear(), new Date().getUTCMonth(), 0)).getDate()

console.log(nbOfDaysInCurrentMonth)

You can get days in month by this command:

new Date(year, month, 0).getDate();

Try this - it returns dictionary with month: days mapping, I think it will be very useful in most cases when people enter this topic:

const getMonthsDaysForYear = (year) => {
  let monthDaysDictionary = {};

  for(let i = 1; i <= 11; i++) {
      const date = new Date(year, i + 1, 0);
      const monthName = date.toLocaleString('en-GB', { month: 'long' });
      monthDaysDictionary[monthName] = date.getDate();
  }

  return monthDaysDictionary;
}
getMonthsDaysForYear(2022);

Note: that month should be started with 1 as it is mentioned in this answer.

See my function and a test of it:

function numberOfDays(year, month) { // Reference: // https://arslankuyumculuk.com/how-to-calculate-leap-year-formula/ (2022-05-20 16:45 UTC)

numDays=0;
switch(month)
{
    case 1:
        numDays=31;
        break;
    case 2:
        numDays=28;
        break;
    case 3:
        numDays=31;
        break;
    case 4:
        numDays=30;
        break;
    case 5:
        numDays=31;
        break;
    case 6:
        numDays=30;
        break;
    case 7:
        numDays=31;
        break;
    case 8:
        numDays=31;
        break;
    case 9:
        numDays=30;
        break;
    case 10:
        numDays=31;
        break;
    case 11:
        numDays=30;
        break;
    case 12:
        numDays=31;
        break;
}

if(month==2)
{
    if( (year % 100) == 0 )
    {
        if( (year % 400) == 0 )
        {
            numDays=29;
        }
    }
    else
    {
        if( (year % 4) == 0 )
        {
            numDays=29;
        }
    }
}

//
return numDays;

}

// Test:

const years = [2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2100,2400];
month=2;
for (let i = 0; i < years.length; i++) 
{
    let text = "";
    text += years[i] + '/' + month.toString() + ": " + numberOfDays(years[i], month).toString();
    alert(text);
} 

for (let m = 1; m <= 12; m++) 
{
    let text2 = "";
    text2 += "2022/" + m.toString() + ": " + numberOfDays(2022, m).toString();
    alert(text2);
} 
Related