Определить последнюю неделю каждого месяца с помощью JavaScript - PullRequest
2 голосов
/ 26 мая 2010

Какой бы способ был в JavaScript для определения последней недели каждого (текущего) месяца. Или последний понедельник месяца?

Ответы [ 9 ]

1 голос
/ 26 мая 2010

Я бы посоветовал узнать количество дней в месяце, а затем выполнить цикл с последнего дня, пока getDay () не вернет понедельник (1) или воскресенье (0) .. в зависимости от того, когда начинается ваша неделя. Как только вы получите свою начальную дату ... конечной датой будет startDate + 7, так что что-то вроде этого

Я нашел это полезно:

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

Тогда цикл:

//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; 
  }
}
1 голос
/ 26 мая 2010

Играя с объектом date и его методами, вы можете сделать следующее ..

обновление

полные расчеты до последнего понедельника месяца могут быть сжаты до

var d = new Date();
d.setMonth( d.getMonth() + 1 );
d.setDate(0);
lastmonday = d.getDate() - (d.getDay() - 1);
alert(lastmonday);

подробный пример ..

var now = new Date(); // get the current date

// calculate the last day of the month
if (now.getMonth() == 11 )  // if month is dec then go to next year and first month
{
    nextmonth = 0;
    nextyear = now.getFullYear() + 1;
}
else // otherwise go to next month of current year
{
  nextmonth = now.getMonth() + 1;
  nextyear = now.getFullYear();
}

var d = new Date( nextyear , nextmonth , 0); // setting day to 0 goes to last date of previous month
alert( d.getDay() ); // will alert the day of the week 0 being sunday .. you can calculate from there to get the first day of that week ..
0 голосов
/ 27 мая 2010

Хорошо, пока я придумал такое решение, сделав его немного по-своему и получив несколько упоминаний здесь Он работает правильно и всегда возвращает последний понедельник текущего месяца.

//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
0 голосов
/ 27 мая 2010

Получить последний день месяца:

/**
 * 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;
}

Получить последний понедельник:

/**
 * 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;
}

Получить неделю года для данного дня:

/**
 * 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);
}

Соединение их (если вы используете 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);
0 голосов
/ 26 мая 2010

Я нашел такой пример, который обнаруживает последний понедельник каждой недели, но не обнаруживает последний понедельник месяца. возможно, это поможет найти лучшее решение, этот код выглядит коротким.

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.
0 голосов
/ 26 мая 2010

Вы также можете найти третий понедельник или первый вторник до или после определенной даты, или отметьте каждую среду между двумя датами.

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())
0 голосов
/ 26 мая 2010

Объект Javascript "Date" - ваш друг.

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

Это даст вам дату (в месяце, например, 30) последнего дня месяца, который является выбранным днем ​​недели (от 0 до 7).

Поиск последней недели месяца будет зависеть от того, что вы подразумеваете под этим. Если вы имеете в виду последнюю полную неделю, то (если вы подразумеваете воскресенье - субботу) найдите последнюю субботу и вычтите 6. Если вы имеете в виду последнюю неделю, когда начинается в месяце найти последнее воскресенье.

0 голосов
/ 26 мая 2010

Чтобы определить, является ли это понедельник, используйте .getDay() == 1. Чтобы определить, является ли он последним месяца, добавьте семь дней и сравните месяцы: nextMonday.setDate(monday.getDate()+7); nextMonday.getMonth() == monday.getMonth();

0 голосов
/ 26 мая 2010

Используйте getDay(), чтобы получить день недели последнего дня в месяце и работать с ним (вычитая значение из числа дней в месяце, вероятно, должно сработать. +/- 1).

...