javascriptcalendar

Get Weeks In Month Through Javascript


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.


Solution

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