views:

332

answers:

9

Hi, what would be a way in javascript to detect the last week of each (current) month. Or last monday of the month?

A: 

Use getDay() to get the day of week of the last day in month and work from that (substracting the value from the number of days of the month should probably do the trick. +/- 1).

nc3b
A: 

To determine whether it is a Monday, use .getDay() == 1. To determine if it is the last of the month, add seven days and compare months: nextMonday.setDate(monday.getDate()+7); nextMonday.getMonth() == monday.getMonth();

Eric Mickelsen
A: 

The Javascript "Date" object is your friend.

function lastOfThisMonth(whichDay) {
  var d= new Date(), month = d.getMonth();
  d.setDate(1); 
  while (d.getDay() !== whichDay) d.setDate(d.getDate() + 1);
  for (var n = 1; true; n++) {
    var nd = new Date(d.getFullYear(), month, d.getDate() + n * 7);
    if (nd.getMonth() !== month)
      return new Date(d.getFullYear(), month, d.getDate() + (n - 1) * 7).getDate();
  }
}

That'll give you the date (in the month, like 30) of the last day of the month that's the chosen day of the week (0 through 7).

Finding the last week of the month will depend on what you mean by that. If you mean the last complete week, then (if you mean Sunday - Saturday) find the last Saturday, and subtract 6. If you mean the last week that starts in the month, find the last Sunday.

Pointy
Clearly it's not really necessary to loop to find the last date; a simple division would figure that out, but I'm too lazy/dumb to figure out exactly what it'd look like.
Pointy
i really dont like looping through days, hope we can avoid it.
Alex
Well at least it skips 7 at a time :) Let me think about it.
Pointy
+1  A: 
Gaby
looks like a working and very short solution, indeed returns last monday, will be testing more, anyone else thinks the same way?
Alex
ok i found a problem with that code. For some reason if the last day of the month is actually monday then it will alert the last monday of next month.
Alex
@Alex, this month (may 2010) does have a monday at the last day of the month (31 may 2010). and the code if run alerts 31 ... can you give another example (*which you found to be wrong*) so i can test it and find out the problem ?
Gaby
+1  A: 

I would suggest to get the number of days in the month and then loop from the last day until getDay() gives back a Monday (1) or Sunday(0) .. based on when does your week start. Once you get your start date ... end date would be startDate + 7 so something along these lines

I found this helpful :

//Create a function that determines how many days in a month
//NOTE: iMonth is zero-based .. Jan is 0, Feb is 2 and so on ...
function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}

Then the loop:

//May - should return 31
var days_in_month = daysInMonth(4, 2010);

var weekStartDate = null;
var weekEndDate = null;    

for(var i=days_in_month; i>0; i--)
{
  var tmpDate = new Date(2010, 4, i);
  //week starting on sunday
  if(tmpDate.getDay() == 0)
  {
    weekStartDate = new Date(tmpDate);
    weekEndDate = new Date(tmpDate.setDate(tmpDate.getDate() + 6));
    //break out of the loop
    break; 
  }
}
drusnov
A: 

You may also like to find the third Monday or the first Tuesday before or after a given date, or flag every Wednesday between two dates.

Date.prototype.lastweek= function(wd, n){
    n= n || 1;
    return this.nextweek(wd, -n);
}
Date.prototype.nextweek= function(wd, n){
    if(n== undefined) n= 1;
    var incr= (n<0)? 1: -1,
    D= new Date(this),
    dd= D.getDay();
    if(wd=== undefined) wd= dd;
    if(dd!= wd) while(D.getDay()!= wd) D.setDate(D.getDate()+incr);
    D.setDate(D.getDate()+7*n);
    D.setHours(0, 0, 0, 0);
    return D;
}


function lastMondayinmonth(month, year){
    var day= new Date();
    if(!month) month= day.getMonth()+1;
    if(!year) year= day.getFullYear();
    day.setFullYear(year, month, 0);
    return day.lastweek(1);
}
alert(lastMondayinmonth())
kennebec
A: 

i found such example that detects last monday of each week but it wont detect last monday of the month. maybe it will help to find better solution, that code looks short.

var dif, d = new Date(); // Today's date
dif = (d.getDay() + 6) % 7; // Number of days to subtract
d = new Date(d - dif * 24*60*60*1000); // Do the subtraction

alert(d); // Last monday.
Alex
A: 

Get the last day of the month:

/**
 * Accepts either zero, one, or two parameters.
 *     If zero parameters: defaults to today's date
 *     If one parameter: Date object
 *     If two parameters: year, (zero-based) month
 */
function getLastDay() {
    var year, month;
    var lastDay = new Date();

    if (arguments.length == 1) {
        lastDay = arguments[0];
    } else if (arguments.length > 0) {
        lastDay.setYear(arguments[0]);
        lastDay.setMonth(arguments[1]);
    }

    lastDay.setMonth(lastDay.getMonth() + 1);
    lastDay.setDate(0);

    return lastDay;
}

Get the last Monday:

/**
 * Accepts same parameters as getLastDay()
 */
function getLastMonday() {
    var lastMonday = getLastDay.apply(this, arguments);
    lastMonday.setDate(lastMonday.getDate() - (lastMonday.getDay() == 0 ? 6 : (lastMonday.getDay() - 1)));
    return lastMonday;
}

Get week of the year for a given day:

/**
 * Accepts one parameter: Date object.
 * Assumes start of week is Sunday.
 */
function getWeek(d) {
    var jan1 = new Date(d.getFullYear(), 0, 1);
    return Math.ceil((((d - jan1) / (24 * 60 * 60 * 1000)) + jan1.getDay() + 1) / 7);
}

Putting them together (assuming you're using Firebug):

// Get the last day of August 2006:
var august2006 = new Date(2006, 7);
var lastDayAugust2006 = getLastDay(august2006);
console.log("lastDayAugust2006: %s", lastDayAugust2006);

// ***** Testing getWeek() *****
console.group("***** Testing getWeek() *****");
    // Get week of January 1, 2010 (Should be 1):
    var january12010Week = getWeek(new Date(2010, 0, 1));
    console.log("january12010Week: %s", january12010Week);

    // Get week of January 2, 2010 (Should still be 1):
    var january22010Week = getWeek(new Date(2010, 0, 2));
    console.log("january22010Week: %s", january22010Week);

    // Get week of January 3, 2010 (Should be 2):
    var january32010Week = getWeek(new Date(2010, 0, 3));
    console.log("january32010Week: %s", january32010Week);
console.groupEnd();
// *****************************

// Get the last week of this month:
var lastWeekThisMonth = getWeek(getLastDay());
console.log("lastWeekThisMonth: %s", lastWeekThisMonth);

// Get the last week of January 2007:
var lastWeekJan2007 = getWeek(getLastDay(2007, 0));
console.log("lastWeekJan2007: %s", lastWeekJan2007);

// Get the last Monday of this month:
var lastMondayThisMonth = getLastMonday();
console.log("lastMondayThisMonth: %s", lastMondayThisMonth);

// Get the week of the last Monday of this month:
var lastMondayThisMonthsWeek = getWeek(lastMondayThisMonth);
console.log("lastMondayThisMonthsWeek: %s", lastMondayThisMonthsWeek);
Christopher Parker
A: 

OK, so far i came up with such solution making it a bit of my own way and getting a few things mentioned here. It works correct and always returns the last monday of current month.

//function that will help to check how many days in month
function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}


var dif = null;
d = new Date(); // Today's date
countDays = daysInMonth(d.getMonth(),d.getFullYear()); //Checking number of days in current month
d.setDate(countDays); //setting the date to last day of the month
dif = (d.getDay() + 6) % 7; // Number of days to subtract
d = new Date(d - dif * 24*60*60*1000); // Do the subtraction
alert(d.getDate()); //finally you get the last monday of the current month
Alex