Moment.js生成时间槽问题:需首个时段距当前时间约30分钟
解决方案
要实现首个时间槽与当前时间间隔约30分钟的需求,我们需要调整起始时间的计算逻辑——不再直接对当前分钟取整到30分钟倍数,而是先把当前时间往后推30分钟,再向上取整到最近的15分钟时间点。这样既能保证首个时间槽和当前时间的间隔达标,又能维持15分钟的时间槽间隔规则。
修改后的代码如下:
// 使用Moment.js库 function getTimeStops(end) { var baseTime, roundedMinutes, startTime, endTime, timeStops; // 1. 先将当前时间往后推30分钟,作为起始时间的基准线 baseTime = moment().utc().add(30, 'minutes'); // 2. 把基准时间的分钟数向上取整到最近的15分钟倍数 roundedMinutes = Math.ceil(baseTime.minute() / 15) * 15; // 3. 生成最终的起始时间(Moment会自动处理小时进位,比如分钟设为60时会转为下一小时的0分) startTime = baseTime.clone().set({ minute: roundedMinutes }); endTime = moment(end, 'HH:mm'); if (endTime.isBefore(startTime)) { endTime.add(1, 'day'); } timeStops = []; while (startTime <= endTime) { timeStops.push(new moment(startTime).format('HH:mm')); startTime.add(15, 'minutes'); } return timeStops; } var timeStops = getTimeStops('02:00'); console.log('timeStops ', timeStops);
逻辑说明
- 原代码的问题:之前的逻辑是直接对当前分钟数取整到30分钟倍数(比如15:25会取到15:30),导致首个时间槽和当前时间仅间隔5分钟,完全不符合30分钟的要求。
- 修改后的核心逻辑:
- 先给当前时间加30分钟,确保起始时间的基础线满足“至少间隔30分钟”的要求;
- 对这个基础线的分钟数向上取整到15的倍数,保证起始时间是15分钟间隔的标准时间点(比如15:55会取到16:00,16:10会取到16:15);
- Moment.js的
set方法会自动处理分钟数超过60的情况,无需额外写代码处理小时进位。
测试示例
当当前时间为15:25时:
- baseTime = 15:25 + 30分钟 = 15:55
- roundedMinutes = Math.ceil(55/15)*15 = 60
- startTime = 15:55 调整分钟为60 → 自动转为16:00
- 生成的时间槽从16:00开始,每隔15分钟递增,完全符合需求。
内容的提问来源于stack exchange,提问作者Hamza L.
相关产品推荐
相关产品推荐

