如何为一周每日分配时间范围数组?代码问题排查
修复基于Moment.js的星期时间范围生成问题
需求回顾
需要生成一个包含7个对象的数组,每个对象对应一周的一天(周日到周六),每个对象下的数组存储4小时分段的秒级时间戳范围,规则如下:
- 活动时长为7天时:每天对应6个时间范围(当天的6个4小时段)
- 活动时长为8天时:周一对应的数组包含12个时间范围(本周周一+下周周一的各6个段),其余天数仍为6个
- 活动时长为14天时:所有天数的数组都包含12个时间范围(两周内对应星期的各6个段)
原代码问题分析
原代码存在两个核心问题:
- 冗余数据过多:循环遍历了活动时长的所有天数,导致每个星期几的数组包含了连续
durationOfCampaignInDays天的时间段,而非仅对应星期几的日期 - 时间戳与日期不匹配:未筛选出对应星期几的日期,导致比如周四的数组中混入了其他日期的时间戳
修复后的代码
引用Moment.js脚本
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
修复后的JavaScript代码
const daysArrayDummy = ['Sundays', 'Mondays', 'Tuesdays', 'Wednesdays', 'Thursdays', 'Fridays', 'Saturdays']; const startOfTheDay = moment().startOf("day"); const durationOfCampaignInDays = 8; // 可替换为7或14,测试不同场景 const updatedDaysArray = daysArrayDummy.map((dayName, dayIndex) => { // 确定当前星期几需要覆盖的日期数量 let targetDateCount = 1; if (durationOfCampaignInDays === 14) { targetDateCount = 2; } else if (durationOfCampaignInDays === 8 && dayIndex === 1) { targetDateCount = 2; } const dailyTimeRanges = []; // 生成对应星期几的目标日期,并生成时间段 for (let count = 0; count < targetDateCount; count++) { // 获取第count周的对应星期几的日期(count=0为当前周,count=1为下一周) const targetDate = moment(startOfTheDay).day(dayIndex + count * 7); // 生成当天的6个4小时时间段 for (let hourSegment = 0; hourSegment < 6; hourSegment++) { const rangeStart = moment(targetDate).add(hourSegment * 4, 'hours'); const rangeEnd = moment(targetDate).add((hourSegment + 1) * 4, 'hours'); const startTimestamp = Math.floor(rangeStart.valueOf() / 1000); const endTimestamp = Math.floor(rangeEnd.valueOf() / 1000); const startKey = `${rangeStart.format('T_HH:mm')}_Start`; const endKey = `${rangeEnd.format('T_HH:mm')}_End`; dailyTimeRanges.push({ [startKey]: startTimestamp, [endKey]: endTimestamp }); } } return { [dayName]: dailyTimeRanges }; }); console.log('Updated daysArray: ', updatedDaysArray);
代码逻辑说明
- 目标日期数量控制:根据活动时长和当前星期几,判断需要生成1个还是2个对应日期(比如时长8天时仅周一需要覆盖两周)
- 精准获取目标日期:使用
moment().day(dayIndex + count*7)直接定位到对应星期几的日期,count=0为当前周的该天,count=1为下一周的同一天 - 生成时间段:对每个目标日期,生成6个连续的4小时时间段,转换为秒级时间戳后存入数组
- 构建结果结构:通过
map遍历星期数组,返回每个星期几对应的时间段数组对象,完全匹配需求结构
内容的提问来源于stack exchange,提问作者SirBT
相关产品推荐
相关产品推荐

