如何使用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
相关产品推荐
相关产品推荐

