You need to enable JavaScript to run this app. 如何使用moment.js将指定日期范围转换为周日至周六的周区间
优惠活动
大模型
产品
解决方案
定价
更多

如何使用moment.js将指定日期范围转换为周日至周六的周区间

moment.js 按周日为周起始拆分日期范围的实现

实现逻辑

  • 先配置moment的周起始日为周日,保证startOf('week')、endOf('week')方法按周日到周六的规则计算
  • 遍历输入的日期范围,每次取当前周期的起始日期,计算当前周的周六结束日期,结束日期不能超过传入的总结束日期
  • 每生成一个周区间后,将下一个周期的起始日期设为当前周结束日期的后一天,直到起始日期超过总结束日期停止循环

完整代码

// 配置周起始为周日(dow = 0 代表周日为周第一天)
moment.updateLocale('en', {
  week: {
    dow: 0,
    doy: 4 // 周计算配套参数,可固定写死不影响核心逻辑
  }
})

/**
 * 拆分日期范围为周日到周六的周区间
 * @param {string} fromStr 起始日期字符串,格式DD-MM-YYYY
 * @param {string} toStr 结束日期字符串,格式DD-MM-YYYY
 * @param {string} format 输入输出的日期格式,默认DD-MM-YYYY
 * @returns {Array<{start: string, end: string}>} 周区间数组
 */
function splitWeeks(fromStr, toStr, format = 'DD-MM-YYYY') {
  const result = []
  // 解析日期时指定格式,避免不同环境解析规则不一致出错
  let currentStart = moment(fromStr, format)
  const endDate = moment(toStr, format)

  while (currentStart.isSameOrBefore(endDate)) {
    // 计算当前周的周六结束日期,统一取0点避免时分秒影响日期比较
    let currentEnd = currentStart.clone().endOf('week').startOf('day')
    // 周结束日期不能超过总结束日期
    if (currentEnd.isAfter(endDate)) {
      currentEnd = endDate.clone()
    }
    result.push({
      start: currentStart.format(format),
      end: currentEnd.format(format)
    })
    // 下一个周期起始为当前周结束的后一天
    currentStart = currentEnd.clone().add(1, 'day')
  }
  return result
}

测试效果

输入示例参数调用:

const weeks = splitWeeks('01-10-2014', '31-10-2014')
weeks.forEach(item => console.log(`${item.start} - ${item.end}`))

输出结果和需求示例完全一致:

01-10-2014 - 04-10-2014
05-10-2014 - 11-10-2014
12-10-2014 - 18-10-2014
19-10-2014 - 25-10-2014
26-10-2014 - 31-10-2014

注意事项

如果需要调整周起始规则,只需修改dow参数即可,1代表周起始为周一,以此类推。

内容的提问来源于stack exchange,提问作者Manjari Dhoundiyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 01:54:02