如何从日期数组中提取连续日期范围?
提取日期数组中的连续日期范围
需求说明
给定一组日期字符串数组,需要从中提取所有连续的日期区间。例如:
输入:['2022-01-01','2022-01-02','2022-01-03','2022-01-04','2022-01-09','2022-01-10','2022-01-15']
预期输出:
[ {start: '2022-01-01', end: '2022-01-04'}, {start: '2022-01-09', end: '2022-01-10'}, {start: '2022-01-15', end: '2022-01-15'} ]
实现方案(JavaScript)
核心思路是通过时间戳判断相邻日期是否相差1天,以此划分连续区间:
function getDates(dateArr) { // 空数组直接返回 if (!dateArr.length) return []; // 转换为包含原字符串和时间戳的对象数组,方便计算 const processedDates = dateArr.map(date => ({ str: date, timestamp: new Date(date).getTime() })); const result = []; // 初始化第一个区间的起始和结束 let currentStart = processedDates[0].str; let currentEnd = processedDates[0].str; for (let i = 1; i < processedDates.length; i++) { const prevTimestamp = processedDates[i - 1].timestamp; const currTimestamp = processedDates[i].timestamp; // 一天对应的毫秒数:24*60*60*1000 = 86400000 const oneDayMs = 86400000; if (currTimestamp - prevTimestamp === oneDayMs) { // 日期连续,更新当前区间的结束日期 currentEnd = processedDates[i].str; } else { // 日期不连续,将当前区间存入结果,重置新的区间 result.push({ start: currentStart, end: currentEnd }); currentStart = processedDates[i].str; currentEnd = processedDates[i].str; } } // 把最后一个未存入的区间加入结果 result.push({ start: currentStart, end: currentEnd }); return result; } // 测试用例 const testDates = ['2022-01-01','2022-01-02','2022-01-03','2022-01-04','2022-01-09','2022-01-10','2022-01-15']; console.log(getDates(testDates));
注意事项
- 输入的日期字符串需为
new Date()可正确解析的格式(如YYYY-MM-DD) - 若输入数组为空,函数会返回空数组
- 单个日期会被处理为起始和结束日期相同的独立区间
内容的提问来源于stack exchange,提问作者anticol
相关产品推荐
相关产品推荐

