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

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

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

### Solution 1:

``````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.

### Solution 2:

If you call this function often, it may be useful to cache the value for better performance.

Here is caching version of 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();
}
})();
``````

### Solution 3:

Some answers (also on other questions) had leap-year problems or used the Date-object. Although javascript’s `Date object` covers approximately 285616 years (100,000,000 days) on either side of January 1 1970, I was fed up with all kinds of unexpected date inconsistencies across different browsers (most notably year 0 to 99). I was also curious how to calculate it.

So I wrote a simple and above all, small algorithm to calculate the correct (Proleptic Gregorian / Astronomical / ISO 8601:2004 (clause 4.3.2.1), so year `0` exists and is a leap year and negative years are supported) number of day’s for a given month and year.
It uses the short-circuit bitmask-modulo leapYear algorithm (slightly modified for js) and common mod-8 month algorithm.

Note that in `AD/BC` notation, year 0 AD/BC does not exist: instead year `1 BC` is the leap-year!
IF you need to account for BC notation then simply subtract one year of the (otherwise positive) year-value first!! (Or subtract the year from `1` for further year-calculations.)

``````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>``````

Note, months must be 1-based!

Note, this is a different algorithm then the magic number lookup I used in my Javascript calculate the day of the year (1 – 366) answer, because here the extra branch for the leap-year is only needed for February.

### Solution 4:

To take away confusion I would probably make the month string based as it is currently 1 based.

``````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
``````

### Solution 5:

With moment.js you can use daysInMonth() method:

``````moment().daysInMonth(); // number of days in the current month
moment("2012-02", "YYYY-MM").daysInMonth() // 29
moment("2012-01", "YYYY-MM").daysInMonth() // 31
``````

### Solution 6:

One-liner direct computation (no Date object):

``````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``````

Variation with 0-based months:

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