Moment.js日期比较逻辑异常:判断多算一天问题求助
解决Moment日期比较多算一天的问题
我猜你遇到的是时间精度不匹配的坑!FullCalendar返回的scope.calendarDateSelected其实是选中日期的当天起始时刻(比如2024-03-30T00:00:00),而你用moment().add(3, 'days')生成的是「当前时间点往后推3天」的时间(比如现在是3月27日下午2点,那生成的就是2024-03-30 14:00:00)。直接用<=比较的话,3月30日0点的日期自然小于3月30日下午2点的时间,导致你期望的3月30日满足条件的情况,实际要等到3月31日才触发。
两种快速修复方案
方案1:统一对齐到当天起始时刻
把两个日期都重置到当天的00:00:00,这样就只对比日期部分,忽略时间差:
const threeDaysLater = moment().add(3, 'days').startOf('day'); if (scope.calendarDateSelected.startOf('day') <= threeDaysLater) { // 符合「小于等于3天后日期」的条件 } else { // 超过3天后的逻辑 }
方案2:用Moment内置的精度比较方法(更推荐)
Moment专门提供了isSameOrBefore方法,支持指定比较精度,代码更清晰:
// 指定按「天」为单位比较,自动忽略时分秒的差异 if (scope.calendarDateSelected.isSameOrBefore(moment().add(3, 'days'), 'day')) { // 小于等于3天后的日期(包含当天) } else { // 超过3天后的处理逻辑 }
再给你理清楚为什么原代码出错
举个具体场景:
- 假设今天是3月27日周五15:00,
moment().add(3, 'days')得到的是3月30日周五15:00 - FullCalendar返回的选中日期是3月30日周五00:00,直接用
<=比较时,00:00<15:00,所以条件不成立 - 只有当选中日期是3月31日周六00:00时,才会大于
3月30日15:00,进入else分支——这就是你看到的“多算一天”的原因
用上面的方法对齐精度后,就能准确判断日期是否在3天范围内啦!
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

