使用moment-timezone的isBetween方法时遇判断失效问题求助
解决moment-timezone时间区间判断失效的问题
看起来你遇到的核心问题是时区不一致以及时间对象的日期部分未正确对齐,导致isBetween无法给出正确结果。下面一步步帮你修复:
关键问题分析
- 时区不统一:你创建的
start/end对象没有指定明确时区,而当前时间moment.tz()如果没设置默认时区,会使用本地时区,两者时区不一致的话,时间比较完全没有意义。 - 日期部分缺失对齐:只解析
16:00:00这种时间字符串时,moment会自动填充当前日期,但如果时区不同,这个"当前日期"可能和你预期的不一样(比如跨天)。
正确实现代码
我们需要确保所有时间对象都使用同一个时区,并且start/end是基于当前日期的目标时间点:
// 先统一指定你需要的时区 const timezone = 'Europe/Lisbon'; // 获取当前时区的时间 const currentTime = moment.tz(timezone); // 创建当天的16:00:00和16:10:00(同时区) const startTime = moment.tz(timezone) .set({ hour: 16, minute: 0, second: 0, millisecond: 0 }); const endTime = moment.tz(timezone) .set({ hour: 16, minute: 10, second: 0, millisecond: 0 }); // 执行区间判断,第三个参数指定精度为分钟,第四个参数表示包含两端边界 if (currentTime.isBetween(startTime, endTime, 'minute', '[]')) { console.log('yep'); } else { console.log('nope'); }
为什么之前的写法无效?
- 第一种写法中,
moment.tz('16:00:00', 'HH:mm:ss', '')的时区参数为空,会导致moment使用本地时区或UTC,和moment.tz()的时区不匹配,自然无法正确比较。 - 第二种写法
moment.tz(moment.now(), 'Europe/Lisbon').isBetween('16:00:00','17:30:00')里,isBetween的两个字符串参数会被moment用本地时区解析,和前面的Europe/Lisbon时区的时间对象不在同一时间基准上,所以返回false。
额外提示
如果需要判断每天固定时间段,上面的代码完全适用;如果要处理跨天的时间段(比如23:00到次日01:00),则需要额外处理日期跨天的逻辑,但你的场景是当天区间,所以不需要。
内容的提问来源于stack exchange,提问作者Rip3rs
相关产品推荐
相关产品推荐

