基于日期与小时生成指定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
相关产品推荐
相关产品推荐

