moment.js 计算当前一周、一月对应日期

一、计算当前一周对应日期
/**
   * 根据一个日期计算出其所在的一周,反正对应一周的相应日期
   * basisDate: 依据日期, 默认是当天
   */
  calcWeekDate(basisDate = moment().format('YYYY-MM-DD')) {
    let weekDate = [];
    let howWeek = moment(basisDate).day();   // 获取到依据日期为星期几;0为星期日、6为星期6
    // 如果今天是周日,则单独处理,往前计算6天
    if (howWeek === 0) {
      let mixins = 0;
      while (mixins <= 6) {
      // 一次减1;即一次减6天,5天... => 获取到了这周的周一、周二、到今天
        weekDate.unshift(moment(basisDate).subtract(mixins, 'days').format('YYYY-MM-DD'));
        mixins++;
      }
      return weekDate;
    }

    let minusNum = 1, addNum = 1;
    // 用今天的日期对应的星期数去往前遍历
    while (minusNum <= howWeek) {
      // 一次减1;即一次减6天,5天... => 获取到了这周的周一、周二、到今天
      weekDate.push(moment(basisDate).subtract(howWeek - minusNum, 'days').format('YYYY-MM-DD'));
      minusNum++;
    }

    // 7 - howWeek 即今天后面要加的天数(一周是7天)
    while(addNum <= (7 - howWeek)) {
      weekDate.push(moment(basisDate).add(addNum, 'days').format('YYYY-MM-DD'));
      addNum++;
    }
    return weekDate;
  }
二、计算当前一月对应日期
/**
   * 根据一个日期计算出其所在的一月,反正对应一月的相应日期
   * basisDate: 依据日期, 默认是当天
   * replenishWeek: 是否需要将该月第一天和最后一天所在的周补全(通日历类似),默认需要
   */
  calcMonthDate(basisDate = moment().format('YYYY-MM-DD'), replenishWeek = true) {
    let monthDate = [];
    const monthStart = moment(basisDate).startOf('month').format("YYYY-MM-DD");      // 该月第一天
    const monthEnd = moment(basisDate).endOf('month').format("YYYY-MM-DD");          // 该月最后一天

    monthDate.push(monthStart);   // 先将当月第一天放到数组中
    let addNum = 1;
    while (monthDate[monthDate.length - 1] < monthEnd) {
      // 依次用当月第一天加,直到该月的最后一天
      monthDate.push(moment(monthStart).add(addNum, 'days').format('YYYY-MM-DD'));
      addNum++;
    }

    if (replenishWeek) {    // 根据参数,补全该月第一天和最后一天所在的周
      // 调用方法,得出该月第一天和最后一天分别是周几 => 星期日为 0、星期六为 6 
      const monthStartWeek = moment(monthDate[0]).day();
      const monthEndWeek = moment(monthDate[monthDate.length - 1]).day();
      let addEmpty = 1, minusNum = 1;

      /** 注意:我们默认的日历显示是 周一 => 周日 */

      let unshiftEnd = monthStartWeek;  // 默认,当月第一天是周几,就往前加n-1天(如周五:往前加5-1天; 周日:往前加7-1天)
      if (monthStartWeek === 0) {
        unshiftEnd = 7
      }

      while (minusNum < unshiftEnd) { // 如果是周一,则一天也不会加
        // 一次减1;即分别在第一天的基础上减一天、两天、三天....;然后放到数组的前面
        monthDate.unshift(moment(monthStart).subtract(minusNum, 'days').format('YYYY-MM-DD'));
        minusNum++;
      }
      
      if (monthEndWeek !== 0) {   // 如果最后一天是周日,则不补齐剩余日期
        // 7 - monthEndWeek 即这个月最后一天后面要加的天数(一周是7天) =>> 往后把一周补全(最后以周六结束,周日在最前面)
        // while(addEmpty < (7 - monthEndWeek + 1)) {   // 7 - monthEndWeek + 1 : 周天在最后;7 - monthEndWeek:周天在最前
        while(addEmpty <= 7 - monthEndWeek) {   //<= : 周天在最后;<:周天在最前
          monthDate.push(moment(monthEnd).add(addEmpty, 'days').format('YYYY-MM-DD'));
          addEmpty++;
        }
      }
    }
    return monthDate;
  }
}

文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值