You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从日期数组中提取连续日期范围?

提取日期数组中的连续日期范围

需求说明

给定一组日期字符串数组,需要从中提取所有连续的日期区间。例如:
输入:['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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:10:30