29

In Javascript, how do I get the number of weeks in a month? I can't seem to find code for this anywhere.

I need this to be able to know how many rows I need for a given month.

To be more specific, I would like the number of weeks that have at least one day in the week (a week being defined as starting on Sunday and ending on Saturday).

So, for something like this, I would want to know it has 5 weeks:

S M T W R F S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 

Thanks for all the help.

1
  • 1
    Your question is missing a few parameters. Pleas be more specific. You want the number of complete weeks in an arbitrary month, or you want a real number of weeks e.g. 4.3, or you want the number of weeks that have at least one day in the month? follow me? Commented Mar 20, 2010 at 16:14

20 Answers 20

55

Weeks start on Sunday

This ought to work even when February doesn't start on Sunday.

function weekCount(year, month_number) { // month_number is in the range 1..12 var firstOfMonth = new Date(year, month_number-1, 1); var lastOfMonth = new Date(year, month_number, 0); var used = firstOfMonth.getDay() + lastOfMonth.getDate(); return Math.ceil( used / 7); } 

Weeks start on Monday

function weekCount(year, month_number) { // month_number is in the range 1..12 var firstOfMonth = new Date(year, month_number-1, 1); var lastOfMonth = new Date(year, month_number, 0); var used = firstOfMonth.getDay() + 6 + lastOfMonth.getDate(); return Math.ceil( used / 7); } 

Weeks start another day

function weekCount(year, month_number, startDayOfWeek) { // month_number is in the range 1..12 // Get the first day of week week day (0: Sunday, 1: Monday, ...) var firstDayOfWeek = startDayOfWeek || 0; var firstOfMonth = new Date(year, month_number-1, 1); var lastOfMonth = new Date(year, month_number, 0); var numberOfDaysInMonth = lastOfMonth.getDate(); var firstWeekDay = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7; var used = firstWeekDay + numberOfDaysInMonth; return Math.ceil( used / 7); } 
Sign up to request clarification or add additional context in comments.

9 Comments

Used this code for a jQuery calendar plugin. Thanks for sharing! You can check it out here: github.com/joelalejandro/jquery-ja/wiki/ja.Calendar
This is great. Any chance you could explain why this works though?
@Titmael I have updated the solution to make it works with weeks starting any day.
Still not working when starting with Monday. Just check Jan 2018. It should return 5 weeks, but it returns 6.
Indeed. Dec 2017 returns 6 weeks, when there are only 5.
|
10

None of the solutions proposed here don't works correctly, so I wrote my own variant and it works for any cases.

Simple and working solution:

/** * Returns count of weeks for year and month * * @param {Number} year - full year (2016) * @param {Number} month_number - month_number is in the range 1..12 * @returns {number} */ var weeksCount = function(year, month_number) { var firstOfMonth = new Date(year, month_number - 1, 1); var day = firstOfMonth.getDay() || 6; day = day === 1 ? 0 : day; if (day) { day-- } var diff = 7 - day; var lastOfMonth = new Date(year, month_number, 0); var lastDate = lastOfMonth.getDate(); if (lastOfMonth.getDay() === 1) { diff--; } var result = Math.ceil((lastDate - diff) / 7); return result + 1; }; 

you can try it here

5 Comments

this is returning wrong result for weeksCount(2018,9)
for me it returns 5, you means you tried for Sep'2018
@MasterYoda @Prabha correct result is 5 for Sep'2018 weeksCount(2018,9) url.upwork.com/_01_GXp87_p0P1s4yQShlUZ9PcxhqsECFVk
but it 5 if you local week starts from Monday this function not supported First day of week feature
"None of the solutions proposed here don't works correctly, so I wrote my own variant and it works for any cases." now with every new answer you need to update yours to defend this statement perhaps.
6

This is very simple two line code. and i have tested 100%.

Date.prototype.getWeekOfMonth = function () { var firstDay = new Date(this.setDate(1)).getDay(); var totalDays = new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate(); return Math.ceil((firstDay + totalDays) / 7); } 

How to use

var totalWeeks = new Date().getWeekOfMonth(); console.log('Total Weeks in the Month are : + totalWeeks ); 

1 Comment

I was looking for dart code, found it here lol, thanks you saved my day
4

You'll have to calculate it.

You can do something like

var firstDay = new Date(2010, 0, 1).getDay(); // get the weekday january starts on var numWeeks = 5 + (firstDay >= 5 ? 1 : 0); // if the months starts on friday, then it will end on sunday 

Now we just need to genericize it.

var dayThreshold = [ 5, 1, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5 ]; function GetNumWeeks(month, year) { var firstDay = new Date(year, month, 1).getDay(); var baseWeeks = (month == 1 ? 4 : 5); // only February can fit in 4 weeks // TODO: account for leap years return baseWeeks + (firstDay >= dayThreshold[month] ? 1 : 0); // add an extra week if the month starts beyond the threshold day. } 

Note: When calling, remember that months are zero indexed in javascript (i.e. January == 0).

Comments

3
function weeksinMonth(m, y){ y= y || new Date().getFullYear(); var d= new Date(y, m, 0); return Math.floor((d.getDate()- 1)/7)+ 1; } alert(weeksinMonth(3)) 

// the month range for this method is 1 (january)-12(december)

2 Comments

now in a normal scenerio , week ends at saturday . Lets say the month is september and year is 2018 . Then weeks should come out to be 6 . See you calender
The answer above just counts the number of "7 days" groups. So all 28 days long Februaries will be return "4" weeks, whatever the starting day is.
3

The most easy to understand way is

<div id="demo"></div> <script type="text/javascript"> function numberOfDays(year, month) { var d = new Date(year, month, 0); return d.getDate(); } function getMonthWeeks(year, month_number) { var $num_of_days = numberOfDays(year, month_number) , $num_of_weeks = 0 , $start_day_of_week = 0; for(i=1; i<=$num_of_days; i++) { var $day_of_week = new Date(year, month_number, i).getDay(); if($day_of_week==$start_day_of_week) { $num_of_weeks++; } } return $num_of_weeks; } var d = new Date() , m = d.getMonth() , y = d.getFullYear(); document.getElementById('demo').innerHTML = getMonthWeeks(y, m); </script> 

Comments

3

using moment js

function getWeeksInMonth(year, month){ var monthStart = moment().year(year).month(month).date(1); var monthEnd = moment().year(year).month(month).endOf('month'); var numDaysInMonth = moment().year(year).month(month).endOf('month').date(); //calculate weeks in given month var weeks = Math.ceil((numDaysInMonth + monthStart.day()) / 7); var weekRange = []; var weekStart = moment().year(year).month(month).date(1); var i=0; while(i<weeks){ var weekEnd = moment(weekStart); if(weekEnd.endOf('week').date() <= numDaysInMonth && weekEnd.month() == month) { weekEnd = weekEnd.endOf('week').format('LL'); }else{ weekEnd = moment(monthEnd); weekEnd = weekEnd.format('LL') } weekRange.push({ 'weekStart': weekStart.format('LL'), 'weekEnd': weekEnd }); weekStart = weekStart.weekday(7); i++; } return weekRange; } console.log(getWeeksInMonth(2016, 7)) 

Comments

2

ES6 variant, using consistent zero-based months index. Tested for years from 2015 to 2025.

/** * Returns number of weeks * * @param {Number} year - full year (2018) * @param {Number} month - zero-based month index (0-11) * @param {Boolean} fromMonday - false if weeks start from Sunday, true - from Monday. * @returns {number} */ const weeksInMonth = (year, month, fromMonday = false) => { const first = new Date(year, month, 1); const last = new Date(year, month + 1, 0); let dayOfWeek = first.getDay(); if (fromMonday && dayOfWeek === 0) dayOfWeek = 7; let days = dayOfWeek + last.getDate(); if (fromMonday) days -= 1; return Math.ceil(days / 7); }

Comments

1

You could use my time.js library. Here's the weeksInMonth function:

// http://github.com/augustl/time.js/blob/623e44e7a64fdaa3c908debdefaac1618a1ccde4/time.js#L67 weeksInMonth: function(){ var millisecondsInThisMonth = this.clone().endOfMonth().epoch() - this.clone().firstDayInCalendarMonth().epoch(); return Math.ceil(millisecondsInThisMonth / MILLISECONDS_IN_WEEK); }, 

It might be a bit obscure since the meat of the functionality is in endOfMonth and firstDayInCalendarMonth, but you should at least be able to get some idea of how it works.

3 Comments

How would you call the function in another script? (I'm not too good with Javascript just yet)
Include the js file on your page, and do something like new Time(2008, 11).weeksInMonth().
Correct me if I'm wrong, but won't this give the same result for a February with 28 days that starts on a Sunday, and a standard February that starts on any other day of the week? They are both exactly 4 week lengths, but the first will display in 4 rows, the second will take 5.
1

This works for me,

function(d){ var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay(); return Math.ceil((d.getDate() + (firstDay - 1))/7); } 

"d" should be the date.

Comments

1

A little rudimentary, yet should cater for original post :

/** * @param {date} 2020-01-30 * @return {int} count */ this.numberOfCalendarWeekLines = date => { // get total let lastDayOfMonth = new Date( new Date( date ).getFullYear(), new Date( date ).getMonth() + 1, 0 ); let manyDaysInMonth = lastDayOfMonth.getDate(); // iterate over month - from 1st // count calendar week lines by occurrence // of a Saturday ( s m t w t f s ) let countCalendarWeekLines = 0; for ( let i = 1; i <= manyDaysInMonth; i++ ) { if ( new Date( new Date( date ).setDate( i ) ).getDay() === 6 ) countCalendarWeekLines++; } // days after last occurrence of Saturday // leaked onto new line? if ( lastDayOfMonth.getDay() < 6 ) countCalendarWeekLines++; return countCalendarWeekLines; }; 

Comments

0

Thanks to Ed Poor for his solution, this is the same as Date prototype.

Date.prototype.countWeeksOfMonth = function() { var year = this.getFullYear(); var month_number = this.getMonth(); var firstOfMonth = new Date(year, month_number-1, 1); var lastOfMonth = new Date(year, month_number, 0); var used = firstOfMonth.getDay() + lastOfMonth.getDate(); return Math.ceil( used / 7); } 

So you can use it like

var weeksInCurrentMonth = new Date().countWeeksOfMonth(); var weeksInDecember2012 = new Date(2012,12,1).countWeeksOfMonth(); // 6 

3 Comments

That looks like the object-oriented way to define the function. Great for those of us with advanced programming skills.
It would be nice to be able to specify the startWeekDay, for instance January 2017 starts a Sunday so it is 5 weeks if week starts a Sunday and 6 if the week starts a Monday.
Natim, I think your edit to my OP is the same as my Jan 2018 re-post. (I just don't know how to use the || operator, so I did a modulus trick.)
0
function getWeeksInMonth(month_number, year) { console.log("year - "+year+" month - "+month_number+1); var day = 0; var firstOfMonth = new Date(year, month_number, 1); var lastOfMonth = new Date(year, parseInt(month_number)+1, 0); if (firstOfMonth.getDay() == 0) { day = 2; firstOfMonth = firstOfMonth.setDate(day); firstOfMonth = new Date(firstOfMonth); } else if (firstOfMonth.getDay() != 1) { day = 9-(firstOfMonth.getDay()); firstOfMonth = firstOfMonth.setDate(day); firstOfMonth = new Date(firstOfMonth); } var days = (lastOfMonth.getDate() - firstOfMonth.getDate())+1 return Math.ceil( days / 7); } 

It worked for me. Please try

Thanks all

Comments

0

This piece of code give you the exact number of weeks in a given month:

Date.prototype.getMonthWeek = function(monthAdjustement) { var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay(); var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7))); return returnMessage; } 

The monthAdjustement variable adds or substract the month that you are currently in

I use it in a calendar project in JS and the equivalent in Objective-C and it works well

Comments

0
 function weekCount(year, month_number, day_start) { // month_number is in the range 1..12 // day_start is in the range 0..6 (where Sun=0, Mon=1, ... Sat=6) var firstOfMonth = new Date(year, month_number-1, 1); var lastOfMonth = new Date(year, month_number, 0); var dayOffset = (firstOfMonth.getDay() - day_start + 7) % 7; var used = dayOffset + lastOfMonth.getDate(); return Math.ceil( used / 7); } 

Comments

0

I know this is coming late, I have seen codes upon codes trying to get the number of weeks a particular month falls on, but many have not been really precise but most have been really informative and reusable, I'm not an expert programmer but I can really think and thanks to some codes by some people I was able to arrive at a conclusion.

function convertDate(date) {//i lost the guy who owns this code lol var yyyy = date.getFullYear().toString(); var mm = (date.getMonth()+1).toString(); var dd = date.getDate().toString(); var mmChars = mm.split(''); var ddChars = dd.split(''); return yyyy + '-' + (mmChars[1]?mm:"0"+mmChars[0]) + '-' + (ddChars[1]?dd:"0"+ddChars[0]); } //this line of code from https://stackoverflow.com/a/4028614/2540911 var days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']; var myDate = new Date('2019-03-2'); //var myDate = new Date(); //or todays date var c = convertDate(myDate).split("-"); let yr = c[0], mth = c[1], dy = c[2]; weekCount(yr, mth, dy) //Ahh yes, this line of code is from Natim Up there, incredible work, https://stackoverflow.com/a/2485172/2540911 function weekCount(year, month_number, startDayOfWeek) { // month_number is in the range 1..12 console.log(weekNumber); // Get the first day of week week day (0: Sunday, 1: Monday, ...) var firstDayOfWeek = startDayOfWeek || 0; var firstOfMonth = new Date(year, month_number-1, 1); var lastOfMonth = new Date(year, month_number, 0); var numberOfDaysInMonth = lastOfMonth.getDate(); var first = firstOfMonth.getDate(); //initialize first week let weekNumber = 1; while(first-1 < numberOfDaysInMonth){ // add a day firstOfMonth = firstOfMonth.setDate(firstOfMonth.getDate() + 1);//this line of code from https://stackoverflow.com/a/9989458/2540911 if(days[firstOfMonth.getDay()] === "Sunday"){//get new week every new sunday according the local date format //get newWeek weekNumber++; } if(weekNumber === 3 && days[firstOfMonth.getDay()] === "Friday") alert(firstOfMonth); first++ } } 

I needed this code to generate a schedule or event scheduler for a church on every 3rd friday of a new month, so you can modify this to suit your or just pick your specific date, not "friday and specify the week of the month and Voila!! here you go

1 Comment

I realised it doesnt fully perfom the function of the event scheduler on days after the specified date i.e friday for the month of july 2019, i was able to modify my code to correctly, eventually, `therefore ignore the " if(weekNumber === 3 && days[firstOfMonth.getDay()] === "Friday")"
0

None of the solutions here really worked for me. Here is my crack at it.

// Example // weeksOfMonth(2019, 9) // October // Result: 5 weeksOfMonth (year, monthIndex) { const d = new Date(year, monthIndex+ 1, 0) const adjustedDate = d.getDate() + d.getDay() return Math.ceil(adjustedDate / 7) } 

1 Comment

weeksOfMonth(2020, 7), for august 2020 it should be 6, but it returned 5.
0

Every solutions helped but nothing was working for me so I did my own with moment library :

const getWeeksInAMonth = (currentDate: string) => { const startOfMonth = moment(currentDate).startOf("month") const endOfMonth = moment(currentDate).endOf("month") return moment(endOfMonth).week() - moment(startOfMonth).week() + 1 } 

2 Comments

Perhaps add some actual dates where this is called and show the results and make this an even better answer. You can even create a snippet and add moment from a cdn like this one <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
This looks good, but not working correctly in December
0

Wrote something extremely simple and direct and works for his usecase which was also my usecase

function countWeeksInMonth(year, month_number) { // month_number is in the range 1..12 const date = new Date(year, month_number); const startDay = new Date(year, month_number, 1).getDay(); let totalDays = new Date(year, month_number + 1, 0).getDate(); let weeks = 0; console.log("total-days initial", { totalDays }); // Step 1: Remove first week totalDays -= 7 - startDay; weeks += 1; console.log("Step 1:", { totalDays, weeks }); // Step 2: Count the full weeks weeks += Math.floor(totalDays / 7); console.log("Step 2:", { weeks }); // Step 3: Check for overflowing weeks if (totalDays % 7 > 0) weeks += 1; console.log("Step 3:", { weeks }); return weeks; } 

Comments

0

Why not just count them? Might take up one or two more CPU cycles, but I doubt it would matter - and the accuracy is very high. This procedure also allows you to select which day your week starts on.

weeksInMonth(year, month, weekStartDay = 0){ // Iterate over all the days in the month, each time // a certain day (weekStartDay - default sunday) is passed, // add one to the count - unless the first day happens to be // weekStartDay let count = 1; let currentDate = new Date(year, month, 1); let endDate = new Date(year, month + 1, 0); let isFirst = true; while(currentDate.getTime() <= endDate.getTime()){ if(currentDate.getDay() === weekStartDay && !isFirst){ count++; } isFirst = false; // Increment the current date currentDate.setDate(currentDate.getDate() + 1); } return count; } 
weeksInMonth(2024, 7); >>> 6 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.