js将一段时间按自然周分组

759 阅读3分钟

将最近两年的时间按自然周分组

最近两年包括今年和去年一年,首先计算出这一段时间内的开始时间和结束时间

image.png

  1. 因为开始时间不一定是周一,结束时间也不一定是周天,那么先计算第一个周一,再计算最后一个周天(此处的第一个周一为开始时间所在周的周一,最后一个周末为最后一天所在周的上周周天,这个时间范围需要根据需求确认)
  2. 根据第一个周一,遍历出这段时间内的所有周一的日期
  3. 根据每个周的周一的日期计算出所在周的周日
   // 对这两年的时间按周分组,包括今年
   
   // start为这段时间内的开始时间,end为结束时间
   getWeek(start,end){
      let  weekArr = new Array();
      
      // 定义变量,存储所有周一
      let  allMonday = new Array();  
      
      // 第一步:先计算最近两年前的第一天所在周的周一,即第一个周一
      let  current = new Date(this.getStartMonday(start));
      // 计算今天的上周周末的日期,即最后一个周末
      end  = new Date(this.getlastSunday(end));
      
      // 第二步:(根据第一个周一和最后一个周末的)计算这段时间范围内的所有周一
      while (current <= end) {
          allMonday.push( current.toLocaleDateString() );
          current.setDate(current.getDate() + 7);
      }
      console.log(allMonday)
      
      // 第三步:根据每周的周一计算每周的周天,从而获取所有自然周的时间范围   
      for(let  i=0;i<allMonday.length;i++){
          // 根据每周的周一计算每周的周末
          let week = this.getWeekInRange(allMonday[i]);
          weekArr[i]=week;
      }
      
      this.weekRangeList = weekArr
      return weekArr;
    },
    
    // 第三步:根据每周的周一计算所在周的周日,并返回这一周的时间范围(周一-周日)
    getWeekInRange(everyMonday){
      // 根据每周的周一计算所在周的周日
      let everySun = this.getEverySunday(everyMonday)
      return everyMonday+'-'+everySun
    },
    
    // 第一步中获取日期所在周的周一,也用于第二步
    getStartMonday(date){
      let  now = new Date(date);
      let  nowTime = now.getTime() ;
      // let  day = now.getDay();
      //此处获取日期时,如果不加|| 7,在日期为星期天时,所获取的周一和周天即下周的周一和周天
      //获取的日期不准确,而加上|| 7则可以获取准确的日期
      let  day = now.getDay()|| 7;
      let  oneDayTime = 24*60*60*1000 ;
      let  MondayTime = nowTime - (day-1)*oneDayTime ;//显示周一
      return new Date(MondayTime).toLocaleDateString();
    },
    
    // 第一步中获取日期的上周的周末
    getlastSunday(date){
      let  now = new Date(date);
      let  nowTime = now.getTime() ;
      // let  day = now.getDay();
      //此处获取日期时,如果不加|| 7,在日期为星期天时,所获取的周一和周天即下周的周一和周天
      //获取的日期不准确,而加上|| 7则可以获取准确的日期
      let  day = now.getDay()|| 7;
      let  oneDayTime = 24*60*60*1000 ;
      let  SundayTime = nowTime - day*oneDayTime ;//显示周一
      return new Date(SundayTime).toLocaleDateString();
    },
    
    // 用于第三步获取日期所在周的周日
    getcurrSunday(date){
      let  now = new Date(date);
      let  nowTime = now.getTime() ;
      // let  day = now.getDay();
      //此处获取日期时,如果不加|| 7,在日期为星期天时,所获取的周一和周天即下周的周一和周天
      //获取的日期不准确,而加上|| 7则可以获取准确的日期
      let  day = now.getDay()|| 7;
      let  oneDayTime = 24*60*60*1000 ;
      let  currSundayTime = nowTime + (7-day)*oneDayTime ;//显示周一
      return new Date(currSundayTime).toLocaleDateString();
    },
    

还可以按以上思路稍加修改进行自然月、季度的分组

image.png

image.png