You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

v2.25.3版本Moment.js的isBetween()判断日期区间不符合预期如何解决

问题根本原因

你当前代码运行结果不符合预期,核心是三个问题:

  1. 区间规则和起止日期的冲突:你给isBetween传入的camStartDate和camEndDate都是2021-09-04,同时用了[)的区间参数,这个参数的规则是「目标日期大于等于左边界,且小于右边界」。当左右边界完全相等时,不可能有满足条件的值,所以必然返回false。
  2. 不必要的字符串转换:你提前把所有Moment对象格式化为YYYY-MM-DD格式的字符串再传入比较,会引入隐式解析的不确定性,也容易忽略时区、时间粒度对齐的问题。
  3. 时间粒度的问题:如果要按天维度做日期比较,需要明确给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:06:03