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

使用Luxon统计创建时间距今≥30天的条目数,diffNow使用疑问

问题:筛选创建时间距今≥30天的条目并统计总数异常

我有如下格式的对象数组:

const arr = [
  {
    id: '1', name: 'thing1', createdAt: '2022-09-21T16:26:02Z',
  },
  {
    id: '2', name: 'thing1', createdAt: '2022-11-21T16:20:20Z',
  },
];

我需要遍历该数组,筛选出创建时间距今≥30天的条目并统计其总数。尝试了以下代码:

// today is 11/21/22

const totalOverdueCount = arr.filter((item) => DateTime.fromISO(item.createdAt).diffNow('days').days >= 30).length

按当前日期(2022-11-21),预期结果应为1,但实际未得到该结果。请问是否错误使用了diffNow方法?


解答

你确实用错了diffNow的逻辑。Luxon里的diffNow()是计算当前时间对象和现在时间的差值:如果时间对象是过去的时间(比如第一个条目的2022-09-21),调用diffNow('days').days会得到负数(因为现在的时间比它晚,差值为负)。你的判断条件是>=30,负数自然不满足,所以筛选不到目标条目。

修正方法有三种,任选其一即可:

方法1:取差值的绝对值

const totalOverdueCount = arr.filter((item) => 
  Math.abs(DateTime.fromISO(item.createdAt).diffNow('days').days) >= 30
).length

方法2:计算“30天前的时间”,直接比较

const thirtyDaysAgo = DateTime.now().minus({ days: 30 });
const totalOverdueCount = arr.filter((item) => 
  DateTime.fromISO(item.createdAt) <= thirtyDaysAgo
).length

方法3:用现在时间去减目标时间

const totalOverdueCount = arr.filter((item) => 
  DateTime.now().diff(DateTime.fromISO(item.createdAt), 'days').days >= 30
).length

这三种方法都能正确筛选出创建时间距今≥30天的条目,按你的测试场景,结果会是1。


内容的提问来源于stack exchange,提问作者nyphur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:25:25