日期双重过滤问题:如何筛选距今日1-7天的记录?
问题原因分析
- 日期计算逻辑错误:你用
Today - 7得到的是当前时间减7毫秒,不是7天!new Date()返回的是毫秒级时间戳,计算N天前的时间必须把天数转换成毫秒:N * 24 * 60 * 60 * 1000(1天=86400000毫秒)。 - 第二种写法需求匹配错误:你要筛选的是「距今日1-7天的记录」,但第二种写法里的条件是
≤30天且≥7天,完全偏离需求。 - 变量冗余/命名错误:第一种写法里的
thirtyday没用到,oneday实际是1毫秒前的时间,和你要的「1天前」完全不是一个概念。
修正后的代码实现
单Filter组合条件写法
const todayTimestamp = new Date().getTime(); // 计算1天前和7天前的毫秒级时间戳 const oneDayAgo = todayTimestamp - 1 * 24 * 60 * 60 * 1000; const sevenDaysAgo = todayTimestamp - 7 * 24 * 60 * 60 * 1000; const machinerecords = this.state.tasksnfiltered; const due = machinerecords.filter(record => { const recordDueTimestamp = Date.parse(record.nextdue); // 过滤条件:记录日期在7天前到1天前之间(即距今日1-7天) // 若你要的是未来1-7天的记录,把判断改成 recordDueTimestamp >= oneDayAgo && recordDueTimestamp <= (todayTimestamp + 7*24*60*60*1000) return recordDueTimestamp >= sevenDaysAgo && recordDueTimestamp <= oneDayAgo; }); this.setState({ due });
链式Filter写法
如果偏好拆分条件的写法,确保条件和需求一致:
const todayTimestamp = new Date().getTime(); const oneDayAgo = todayTimestamp - 1 * 24 * 60 * 60 * 1000; const sevenDaysAgo = todayTimestamp - 7 * 24 * 60 * 60 * 1000; const machinerecords = this.state.tasksnfiltered; const due = machinerecords .filter(record => Date.parse(record.nextdue) >= sevenDaysAgo) .filter(record => Date.parse(record.nextdue) <= oneDayAgo); this.setState({ due });
额外提醒
- 确认
record.nextdue的格式是Date.parse可解析的(比如YYYY-MM-DD、ISO格式),如果格式错误会返回NaN,导致过滤失效。可以在filter里加校验:const recordDueTimestamp = Date.parse(record.nextdue); if (isNaN(recordDueTimestamp)) return false; - 用
getTime()获取时间戳比直接用new Date()做减法更直观,避免混淆。
内容的提问来源于stack exchange,提问作者SecRec01
相关产品推荐
相关产品推荐

