如何基于可变起止日期生成指定间隔天数的日期对二维数组?
生成指定间隔的日期对二维数组
需求明确
- 日期格式固定为
MM/DD/YYYY - 支持自定义起始日期、起始日期后n天作为结束日期
- 生成二维数组,每个元素是一组日期对:
- 每组内两个日期默认间隔指定天数
- 最后一组若无法达到指定间隔,自动缩短为到结束日期的天数
- 所有日期必须成对出现,不能有单独日期遗留
示例效果
当起始日期为 12/01/2022、结束日期为 12/20/2022(即起始日期后19天)、间隔天数为2时,输出如下:
[ ['12/01/2022', '12/03/2022'], ['12/04/2022', '12/06/2022'], ['12/07/2022', '12/09/2022'], ['12/10/2022', '12/12/2022'], ['12/13/2022', '12/15/2022'], ['12/16/2022', '12/18/2022'], ['12/19/2022', '12/20/2022'] ]
优化实现代码
原代码存在硬编码间隔、逻辑拆分冗余的问题,以下是更灵活的实现:
// 给Date对象扩展安全的加天数方法,不修改原日期 Date.prototype.addDays = function (days) { const newDate = new Date(this.valueOf()); newDate.setDate(newDate.getDate() + days); return newDate; }; // 统一格式化日期为MM/DD/YYYY function formatDate(date) { return new Intl.DateTimeFormat('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(date); } // 核心生成函数:起始日期、日期对间隔天数、起始后总天数 function generateDatePairs(startDate, intervalDays, totalDays) { const endDate = startDate.addDays(totalDays); const datePairs = []; let currentStart = startDate; while (currentStart <= endDate) { // 计算当前组的结束日期 let currentEnd = currentStart.addDays(intervalDays); // 若超过总结束日期,直接用总结束日期 if (currentEnd > endDate) { currentEnd = endDate; } // 添加日期对 datePairs.push([formatDate(currentStart), formatDate(currentEnd)]); // 下一组起始日期为当前结束日期+1天,避免重叠 currentStart = currentEnd.addDays(1); } return datePairs; } // 使用示例 const startDate = new Date('2022-12-01'); // 间隔2天,起始日期后19天(到12/20/2022) const result = generateDatePairs(startDate, 2, 19); console.log(result);
代码说明
addDays:通过复制原日期对象实现安全的天数增加,避免污染原日期formatDate:用Intl.DateTimeFormat确保跨环境的MM/DD/YYYY格式输出generateDatePairs:- 接收三个核心参数,完全满足需求中的可变配置
- 循环中自动处理最后一组的间隔截断
- 直接生成二维数组,无需额外拆分步骤,逻辑更清晰
内容的提问来源于stack exchange,提问作者Nikhil Mane
相关产品推荐
相关产品推荐

