【问题标题】:Detect last week of each month with javascript用javascript检测每个月的最后一周
【发布时间】:2010-05-26 14:58:03
【问题描述】:

在 javascript 中检测每个(当前)月份最后一周的方法是什么。还是每月的最后一个星期一?

【问题讨论】:

  • +1 好问题,我即将编写一个自定义日期选择器并开始问自己类似的问题。
  • 那是一个月内的最后一周还是一个月内开始的最后一周?你的星期是从周日还是周一开始?
  • 他确实提到了本月的最后一个星期一 ..

标签: javascript datepicker date week-number gettime


【解决方案1】:

我建议获取该月的天数,然后从最后一天开始循环,直到 getDay() 根据您的一周开始时间返回星期一 (1) 或星期日 (0) ..一旦你得到你的开始日期......结束日期将是 startDate + 7 所以沿着这些线

我发现this 很有帮助:

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

【讨论】:

    【解决方案2】:

    使用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 ..
    

    【讨论】:

    • 看起来像一个有效且非常简短的解决方案,确实在上周一返回,将进行更多测试,其他人也这么认为吗?
    • 好的,我发现该代码有问题。出于某种原因,如果该月的最后一天实际上是星期一,那么它将提醒下个月的最后一个星期一。
    • @Alex,这个月(2010 年 5 月)确实在该月的最后一天(2010 年 5 月 31 日)有一个星期一。如果运行警报 31 的代码......你能再举一个例子吗(你发现是错误的)所以我可以测试它并找出问题?
    【解决方案3】:

    使用getDay() 获取一个月中最后一天的星期几并从中工作(从一个月的天数中减去该值可能就可以了。+/- 1)。

    【讨论】:

      【解决方案4】:

      要确定是否是星期一,请使用.getDay() == 1。要确定它是否是该月的最后一天,请添加 7 天并比较月份:nextMonday.setDate(monday.getDate()+7); nextMonday.getMonth() == monday.getMonth();

      【讨论】:

        【解决方案5】:

        Javascript“日期”对象是你的朋友。

        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。如果您的意思是最后一周开始月,找到最后一个星期日。

        【讨论】:

        • 显然没有必要循环查找最后日期;一个简单的除法就可以解决这个问题,但我太懒/太笨了,无法弄清楚它到底是什么样子。
        • 我真的不喜欢循环往复,希望我们可以避免。
        • 至少它一次跳过 7 个 :) 让我考虑一下。
        【解决方案6】:

        您可能还想查找给定日期之前或之后的第三个星期一或第一个星期二, 或在两个日期之间的每周三标记。

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

        【讨论】:

          【解决方案7】:

          我发现这样的示例可以检测到每周的最后一个星期一,但它不会检测到该月的最后一个星期一。也许这将有助于找到更好的解决方案,该代码看起来很短。

          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.
          

          【讨论】:

            【解决方案8】:

            好的,到目前为止,我想出了这样的解决方案,使它有点我自己的方式,并在这里提到了一些事情。它工作正常并且总是返回当月的最后一个星期一。

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

            【讨论】:

              【解决方案9】:

              获取当月的最后一天:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-08-26
                • 2020-10-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多