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

如何为一周每日分配时间范围数组?代码问题排查

修复基于Moment.js的星期时间范围生成问题

需求回顾

需要生成一个包含7个对象的数组,每个对象对应一周的一天(周日到周六),每个对象下的数组存储4小时分段的秒级时间戳范围,规则如下:

  • 活动时长为7天时:每天对应6个时间范围(当天的6个4小时段)
  • 活动时长为8天时:周一对应的数组包含12个时间范围(本周周一+下周周一的各6个段),其余天数仍为6个
  • 活动时长为14天时:所有天数的数组都包含12个时间范围(两周内对应星期的各6个段)

原代码问题分析

原代码存在两个核心问题:

  1. 冗余数据过多:循环遍历了活动时长的所有天数,导致每个星期几的数组包含了连续durationOfCampaignInDays天的时间段,而非仅对应星期几的日期
  2. 时间戳与日期不匹配:未筛选出对应星期几的日期,导致比如周四的数组中混入了其他日期的时间戳

修复后的代码

引用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. 目标日期数量控制:根据活动时长和当前星期几,判断需要生成1个还是2个对应日期(比如时长8天时仅周一需要覆盖两周)
  2. 精准获取目标日期:使用moment().day(dayIndex + count*7)直接定位到对应星期几的日期,count=0为当前周的该天,count=1为下一周的同一天
  3. 生成时间段:对每个目标日期,生成6个连续的4小时时间段,转换为秒级时间戳后存入数组
  4. 构建结果结构:通过map遍历星期数组,返回每个星期几对应的时间段数组对象,完全匹配需求结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:25:01