如何在JavaScript中从日期数组生成日期区间数组?
将日期数组转换为连续时间区间数组的JavaScript方案
需求说明
需要把按顺序排列的日期数组(格式为dd/MM/yyyy),合并成由连续日期区间对象组成的数组,每个对象包含start_date和end_date,非连续的日期则拆分为独立区间。
可用JavaScript库推荐
你可以借助成熟的日期处理库简化逻辑:
- date-fns:轻量模块化的日期工具库,可通过
parse解析日期,再用addDays和isEqual判断日期是否连续。 - moment.js:老牌日期库(虽进入维护状态但仍可使用),通过
moment(date, 'DD/MM/YYYY')解析日期,再用add(1, 'day')对比下一个日期是否连续。
这些库能帮你快速处理日期解析、增减和相等判断,避免手动处理格式转换的坑。
手动实现方案(无需额外库)
如果不想引入第三方库,可自行实现逻辑,核心步骤为:解析日期为可比较的时间戳、遍历分组连续日期、生成区间数组。
示例代码:
function convertDatesToIntervals(dateArray) { if (!dateArray.length) return []; // 解析dd/MM/yyyy格式日期为时间戳 const parseDate = (dateStr) => { const [day, month, year] = dateStr.split('/').map(Number); return new Date(year, month - 1, day).getTime(); }; const intervals = []; let currentStart = dateArray[0]; let currentEnd = dateArray[0]; let prevTimestamp = parseDate(currentStart); for (let i = 1; i < dateArray.length; i++) { const currentDate = dateArray[i]; const currentTimestamp = parseDate(currentDate); // 判断当前日期是否为前一天的次日(86400000为一天的毫秒数) if (currentTimestamp === prevTimestamp + 86400000) { currentEnd = currentDate; } else { // 非连续则保存当前区间,开启新区间 intervals.push({ start_date: currentStart, end_date: currentEnd }); currentStart = currentDate; currentEnd = currentDate; } prevTimestamp = currentTimestamp; } // 保存最后一个区间 intervals.push({ start_date: currentStart, end_date: currentEnd }); return intervals; } // 测试示例 const inputDates = ["01/01/2015", "02/01/2015", "03/01/2015", "05/01/2015", "06/01/2015"]; console.log(convertDatesToIntervals(inputDates)); // 输出:[{start_date: "01/01/2015", end_date: "03/01/2015"}, {start_date: "05/01/2015", end_date: "06/01/2015"}]
注意事项
- 确保输入日期数组按时间顺序排列,否则需先执行排序处理
- 若实际日期格式为
dd-MM-yyyy,只需将代码中的split('/')改为split('-')即可
内容的提问来源于stack exchange,提问作者hichem chouaibi
相关产品推荐
相关产品推荐

