Moment.js isSameOrBefore返回false:早于14:00的时间戳反而更大
问题排查:Moment.js时间判断异常
我使用以下代码进行时间判断:
if ( moment(mycheckOut, "HH:mm").isSameOrBefore( moment("14:00", "HH:mm") ) ) difference_halfdays++;
执行打印代码:
console.log( 'mycheckOut moment (13:00): ' + moment(mycheckOut, "HH:mm") + ' moment 14:00: ' + moment("14:00", "HH:mm") );
控制台输出结果为:
mycheckOut moment (13:00): 1683561600000 moment 14:00: 1683547200000
按逻辑,13:00对应的时间戳应小于14:00,但实际前者更大,导致isSameOrBefore返回false,以下是排查方向:
- 确认
mycheckOut变量的真实值:检查传入的mycheckOut是否确实为"13:00",有没有可能是包含日期的字符串,导致Moment解析时关联了不同的基准日期。 - 排查Moment默认日期填充的差异:当仅传入
HH:mm格式时,Moment会自动使用当前系统日期作为基准。如果两次moment()调用的时间跨了午夜,就会出现基准日期不同的情况——比如解析mycheckOut时用了次日日期,解析"14:00"时用了当日日期,最终导致13:00的时间戳反而更大。 - 强制统一基准日期:不要依赖默认日期,手动为两个时间对象指定相同的基准日期,示例代码:
// 指定固定基准日期,避免系统时间影响 const baseDate = moment('2023-05-08'); const checkOutTime = moment(baseDate).set({ hour: moment(mycheckOut, "HH:mm").hour(), minute: moment(mycheckOut, "HH:mm").minute() }); const compareTime = moment(baseDate).set({hour: 14, minute: 0}); if (checkOutTime.isSameOrBefore(compareTime)) { difference_halfdays++; } - 打印完整日期信息排查:不要直接拼接Moment对象(会输出时间戳),改用
format()方法打印具体的日期时间,直观查看基准日期是否一致:console.log( 'mycheckOut moment: ' + moment(mycheckOut, "HH:mm").format('YYYY-MM-DD HH:mm'), 'moment 14:00: ' + moment("14:00", "HH:mm").format('YYYY-MM-DD HH:mm') ); - 检查Moment版本兼容性:某些旧版本的Moment在解析时分格式时存在bug,尝试升级到最新稳定版验证问题是否解决。
内容的提问来源于stack exchange,提问作者Luigino
相关产品推荐
相关产品推荐

