You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将结束日期限制为最多31天并提取日期区间周数?

日期区间周数提取方案(含31天区间限制)

需求概述

你需要从指定的开始/结束日期中提取周数,核心规则是:如果日期区间的跨度超过31天,必须将结束日期限制为开始日期后的第31天。举个实际例子:

开始日期为2018年5月1日,默认结束日期为2018年6月30日,调整后的结束日期应为2018年5月31日

实现步骤与完整代码

结合你提供的代码片段,我完善了完整的实现逻辑,使用moment.js处理日期操作(这是前端处理日期最常用的库之一):

weekByDates() {
  // 从localStorage读取存储的日期筛选条件
  let dates = JSON.parse(localStorage.getItem('pfsessionFilter'));
  
  // 异常处理:确保日期数据存在且有效
  if (!dates || dates.length < 2) {
    console.error('无法获取有效的日期筛选数据');
    return [];
  }

  // 解析并格式化开始、结束日期为YYYY-MM-DD格式
  const startDate = moment(dates[0].value).format('YYYY-MM-DD');
  let endDate = moment(dates[1].value).format('YYYY-MM-DD');
  
  // 转换为moment对象进行日期计算
  const startMoment = moment(startDate);
  const originalEndMoment = moment(endDate);
  
  // 计算日期区间的天数差
  const dayDifference = originalEndMoment.diff(startMoment, 'days');
  
  // 应用31天限制:如果区间超过31天,修正结束日期
  if (dayDifference > 30) {
    // 开始日期加30天,得到第31天的日期(比如5.1 +30天 =5.31)
    endDate = startMoment.clone().add(30, 'days').format('YYYY-MM-DD');
  }
  
  // 提取区间内的所有周数(以ISO周数为例)
  const weekList = [];
  const finalEndMoment = moment(endDate);
  let currentDate = moment(startDate);
  
  while (currentDate.isBefore(finalEndMoment) || currentDate.isSame(finalEndMoment)) {
    // 获取ISO周数(年份+周数,周数补两位)
    const year = currentDate.year();
    const weekNum = String(currentDate.isoWeek()).padStart(2, '0');
    weekList.push(`${year}-W${weekNum}`);
    
    // 跳到下一周的起始(ISO周以周一为起始,可根据需求改为周日)
    currentDate.add(1, 'weeks').startOf('isoWeek');
  }
  
  return weekList;
}

关键细节说明

  • 日期限制逻辑:用diff('days')计算的是结束日期与开始日期的天数差,当差值大于30时,说明区间超过31天(比如5.1到5.31的天数差是30,刚好覆盖31天)
  • 周数格式:采用ISO标准的年份-W周数格式(例如2018-W18),如果你的业务需要其他格式(比如仅周数),可以修改weekList.push的内容
  • 异常处理:增加了对localStorage数据缺失的判断,避免代码报错
  • moment.js依赖:确保你的项目中已经引入了moment.js,否则需要先安装或替换为原生Date API的实现(不过原生API处理日期会繁琐很多)

内容的提问来源于stack exchange,提问作者Arun K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:36:30