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

基于日期与小时生成指定UTC时间范围的技术实现问题

解决方案

问题分析

你的现有代码卡顿是因为第二个while循环中edate是固定的时间戳,没有在循环内更新,导致无限循环。另外,使用本地时间方法(如setDate)可能引发时区问题,需要改用UTC相关方法确保处理的是UTC时间。

优化实现

下面是更简洁高效的实现,分三部分处理区间:起始剩余小时、中间完整日期、结束对应小时,全程使用UTC方法避免时区偏差:

// 保留原有的日期获取函数,改用UTC方法确保准确性
function getDatesInRange(startDate, endDate) {
    const date = new Date(startDate.getTime());
    const dates = [];

    while (date <= endDate) {
        // 直接截取ISO字符串的日期部分,更简洁
        const day = date.toISOString().split('T')[0];
        dates.push(day);
        // 使用UTC方法推进日期
        date.setUTCDate(date.getUTCDate() + 1);
    }
    return dates;
}

function getHoursInRange(startDate, endDate) {
    const result = [];
    const startUTC = new Date(startDate);
    const endUTC = new Date(endDate);

    // 1. 处理起始日期的剩余小时(从startUTC的当前小时到当天23点)
    const startDayEnd = new Date(startUTC);
    // 设置为当天UTC的23:59:59.999,确保包含最后一个小时
    startDayEnd.setUTCHours(23, 59, 59, 999);
    let currentHour = new Date(startUTC);
    // 重置到当前小时的起始(比如20:50:59 -> 20:00:00)
    currentHour.setUTCMinutes(0, 0, 0);
    
    while (currentHour <= startDayEnd && currentHour <= endUTC) {
        result.push(currentHour.toISOString().split(':')[0]);
        currentHour.setUTCHours(currentHour.getUTCHours() + 1);
    }

    // 2. 处理中间的完整日期(起始次日到结束前一日)
    const nextDayOfStart = new Date(startUTC);
    nextDayOfStart.setUTCDate(nextDayOfStart.getUTCDate() + 1);
    nextDayOfStart.setUTCHours(0, 0, 0, 0);
    
    const prevDayOfEnd = new Date(endUTC);
    prevDayOfEnd.setUTCDate(prevDayOfEnd.getUTCDate() - 1);
    prevDayOfEnd.setUTCHours(23, 59, 59, 999);
    
    if (nextDayOfStart <= prevDayOfEnd) {
        result.push(...getDatesInRange(nextDayOfStart, prevDayOfEnd));
    }

    // 3. 处理结束日期的对应小时(从0点到endUTC的当前小时)
    if (prevDayOfEnd < endUTC) {
        const endDayStart = new Date(endUTC);
        endDayStart.setUTCHours(0, 0, 0, 0);
        currentHour = new Date(endDayStart);
        
        while (currentHour <= endUTC) {
            result.push(currentHour.toISOString().split(':')[0]);
            currentHour.setUTCHours(currentHour.getUTCHours() + 1);
        }
    }

    return result;
}

// 测试示例
console.log(getHoursInRange(new Date('2022-10-10T20:50:59.938Z'), new Date('2022-10-15T01:50:59.938Z')));

输出结果

["2022-10-10T20","2022-10-10T21","2022-10-10T22","2022-10-10T23","2022-10-11","2022-10-12","2022-10-13","2022-10-14","2022-10-15T00","2022-10-15T01"]

关键优化点

  • 使用setUTCHours、setUTCDate等UTC方法,确保所有日期操作基于UTC时间,避免时区差异导致的错误。
  • 拆分逻辑为三个独立部分,代码更清晰,易于维护。
  • 修复了原代码中无限循环的问题,通过在循环内更新currentHour确保循环能正常终止。
  • 简化了日期格式的截取方式,直接使用toISOString()的结果进行拆分,更高效可靠。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:50:37