使用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
相关产品推荐
相关产品推荐

