如何在不使用循环的情况下将Epoch时间戳按月份拆分
按指定日期跨度拆分Epoch时间戳(无循环实现)
需求说明
给定两个Epoch时间戳startDate和endDate,需按起始日期的月度跨度拆分时间段:
- 示例:若startDate是1月14日的时间戳,endDate是3月19日的时间戳,需拆分为:1月14日→2月14日、2月14日→3月14日、3月14日→3月19日
- 结果需为Epoch时间戳组成的数组,禁止使用for/while/do-while循环
- 给定输入:startDate=1673676037,endDate=1681887198
现有代码问题
你提供的代码存在两处不符合需求的问题:
- 使用了
while循环,违反无循环的要求 - 拆分逻辑是按自然月起止(每月1号到月底),而非需求中的起始日期对应月度跨度
无循环实现方案
采用递归替代循环,同时实现按起始日期的月度跨度拆分:
const breakIntoMonths = (startEpoch, endEpoch, result = []) => { const startDate = new Date(startEpoch); // 计算下一个月同一时刻的时间戳 const nextMonthDate = new Date( startDate.getFullYear(), startDate.getMonth() + 1, startDate.getDate(), startDate.getHours(), startDate.getMinutes(), startDate.getSeconds() ); const nextMonthEpoch = nextMonthDate.getTime(); // 当前时间段的结束取「下一月同一时刻」和「endEpoch」的较小值 const currentEnd = Math.min(nextMonthEpoch, endEpoch); result.push({ start: startEpoch, end: currentEnd }); // 递归终止条件:当前结束时间等于endEpoch时停止 if (currentEnd === endEpoch) { return result; } // 递归处理下一个时间段 return breakIntoMonths(nextMonthEpoch, endEpoch, result); }; // 测试给定输入 const value = breakIntoMonths(1673676037, 1681887198); console.log(value);
代码说明
- 递归逻辑:通过递归调用自身处理后续时间段,完全避免显式循环
- 月度跨度计算:基于起始日期的年、月、日、时分秒生成下一月的同一时刻,保证每个时间段的跨度为自然月(对应起始日期)
- 边界处理:最后一个时间段的结束时间被限制为
endEpoch,不会超出范围 - 结果格式:返回数组包含每个时间段的
start和end字段,均为Epoch时间戳
测试结果
针对给定输入:
- startDate=1673676037 → 对应时间:2023-01-14 02:00:37
- endDate=1681887198 → 对应时间:2023-04-19 01:33:18
拆分结果为:
[ { start: 1673676037, end: 1676354437 }, // 2023-01-14 → 2023-02-14 02:00:37 { start: 1676354437, end: 1678946437 }, // 2023-02-14 → 2023-03-14 02:00:37 { start: 1678946437, end: 1681624837 }, // 2023-03-14 → 2023-04-14 02:00:37 { start: 1681624837, end: 1681887198 } // 2023-04-14 → 2023-04-19 01:33:18 ]
内容的提问来源于stack exchange,提问作者Suraj Mandal
相关产品推荐
相关产品推荐

