v2.25.3版本Moment.js的isBetween()判断日期区间不符合预期如何解决
问题根本原因
你当前代码运行结果不符合预期,核心是三个问题:
- 区间规则和起止日期的冲突:你给
isBetween传入的camStartDate和camEndDate都是2021-09-04,同时用了[)的区间参数,这个参数的规则是「目标日期大于等于左边界,且小于右边界」。当左右边界完全相等时,不可能有满足条件的值,所以必然返回false。 - 不必要的字符串转换:你提前把所有Moment对象格式化为
YYYY-MM-DD格式的字符串再传入比较,会引入隐式解析的不确定性,也容易忽略时区、时间粒度对齐的问题。 - 时间粒度的问题:如果要按天维度做日期比较,需要明确给
isBetween指定第三个参数为'day',或者手动把所有日期对齐到当天的startOf('day'),避免时分秒部分干扰判断。
修正方案
按照你提出的校验规则:araDate处于startdate和enddate的闭区间内,或者araDateMinusOne处于区间内、但araDateMinusOne等于startdate时不匹配,可以参考如下写法:
const obj = { _id: '614c2b941e06b7003024e1df', promotedtitles: [{ title: '1' }, { title: '2' }], startdate: '2021-09-04T00:00:00.000Z', enddate: '2021-09-04T00:00:00.000Z' }; // 保留Moment对象,不要提前转字符串,统一对齐到当日起始时间 const camStartDate = moment(obj.startdate).startOf('day'); const camEndDate = moment(obj.enddate).startOf('day'); const araDate = moment('2021-09-05T00:00:00.000Z').startOf('day'); const araDateMinusOne = moment('2021-09-05T00:00:00.000Z').subtract(1, 'day').startOf('day'); // 校验1:araDate在闭区间内 const check1 = araDate.isBetween(camStartDate, camEndDate, 'day', '[]'); // 校验2:araDateMinusOne在左开右闭区间内(自动排除等于startdate的情况) const check2 = araDateMinusOne.isBetween(camStartDate, camEndDate, 'day', '(]'); // 也可以按规则手动判断,逻辑更清晰不容易出错 const check2Manual = araDateMinusOne.isBetween(camStartDate, camEndDate, 'day', '[]') && !araDateMinusOne.isSame(camStartDate, 'day'); console.log('check1', check1); // false 符合预期 console.log('check2', check2); console.log('check2Manual', check2Manual);
如果你的需求是startdate和enddate为同一天时,等于该日期的情况需要算匹配,可以单独加判断:
const check2 = araDateMinusOne.isBetween(camStartDate, camEndDate, 'day', '(]') || (camStartDate.isSame(camEndDate, 'day') && araDateMinusOne.isSame(camStartDate, 'day'));
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

