Node.js使用moment.js循环生成时隙时如何正确递推更新时间值
问题根因
你的代码无法生成连续时隙的核心原因是:每轮循环都重新使用原始scheduleStartDate初始化起始时间对象,所有轮次的计算都基于最原始的开始时间,没有做时间累加,自然输出的都是同一组起止时间。
这个需求不需要调用Moment.js的特殊方法,只要调整变量作用域、补全累加逻辑即可实现。
可直接运行的修复代码
const moment = require('moment'); const objTime = { scheduleStartDate: "2022-07-13T12:00:00.540+00:00", slotDuration: 30, noOfSlots: 5, }; // 仅在循环外初始化一次起始时间,避免每轮重置 let currentSlotStart = moment(objTime.scheduleStartDate); // 如果需要匹配你示例里的05:30起始输出,把上一行替换成下面这行,设置对应UTC时区偏移即可 // let currentSlotStart = moment(objTime.scheduleStartDate).utcOffset(-390); for (let i = 0; i < objTime.noOfSlots; i++) { const currentSlotEnd = moment(currentSlotStart).add(objTime.slotDuration, "minutes"); console.log( `Start : ${currentSlotStart.format("DD-MM-YYYY hh:mm:ss")} | End : ${currentSlotEnd.format("DD-MM-YYYY hh:mm:ss")}` ); // 将下一轮的起始时间更新为当前轮的结束时间,实现逐次后移 currentSlotStart = currentSlotEnd; }
逻辑说明
- 把起始时间的初始化移到循环外部,全程复用同一个时间变量做累加,避免每轮重置到初始时间
- 每轮计算完当前时隙的结束时间后,直接把该结束时间赋值给下一轮的起始时间变量,天然实现连续时隙的偏移
- 时区问题可以通过
utcOffset()方法统一设置偏移量,你示例中05:30的起始输出对应的是UTC-6:30时区,偏移值为-390分钟,按需设置即可。
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

