如何比较JSON日期并筛选指定时段数据?代码异常求助
问题概述
尝试筛选当日早班(8:00-14:00)内标记为"Like"的投票数据,但最终筛选结果为空数组。其中votesforDay能正确返回当日所有记录,但后续针对早班时段的筛选失效。
核心问题原因
字符串日期比较的逻辑漏洞
直接用字符串格式的日期进行大小比较,依赖字符串字典序,当日期格式不一致时会出错。比如firstShiftStart生成的是"2022-12-21 8:00:00"(小时为一位数),而数据中的Created字段是"2022-12-21 08:10:00"(小时为两位数),字符串比较时"08"会被判定为小于"8",导致本该被包含的记录被排除。无效的八进制数字写法
代码中08是无效八进制数字(八进制仅允许0-7),非严格模式下会被解析为0,导致firstShiftStart的小时部分变为0,彻底偏离预期的早班开始时间。日期格式不统一
today生成时对月份、日期做了补零处理(如1月转为01),但firstShiftStart和firstShiftEnd未补零,格式不一致进一步加剧了字符串比较的错误。
修复方案
方案1:转成Date对象进行比较(最可靠)
将所有日期字符串转换为Date对象,通过时间戳比较,同时修正日期生成逻辑保证格式统一:
// 统一生成当日标准格式的日期片段 const today = new Date(); const pad = num => String(num).padStart(2, '0'); const year = today.getFullYear(); const month = pad(today.getMonth() + 1); const day = pad(today.getDate()); // 生成早班开始/结束的Date对象 const firstShiftStart = new Date(`${year}-${month}-${day} 08:00:00`); const firstShiftEnd = new Date(`${year}-${month}-${day} 14:00:00`); const todayStart = new Date(`${year}-${month}-${day}`); // 当日0点 // 筛选当日数据 const votesforDay = dataAllJson.filter(x => new Date(x.Created) >= todayStart); // 筛选早班时段的Like投票 const likesFirstShift = votesforDay.filter(x => { const createdDate = new Date(x.Created); return createdDate >= firstShiftStart && createdDate <= firstShiftEnd && x.Choice === "Like"; }).length;
方案2:统一日期字符串格式后直接比较
如果不想转成Date对象,必须保证所有日期字符串格式完全一致(YYYY-MM-DD HH:mm:ss,所有部分为两位数):
const today = new Date(); const pad = num => String(num).padStart(2, '0'); const year = today.getFullYear(); const month = pad(today.getMonth() + 1); const day = pad(today.getDate()); const todayStr = `${year}-${month}-${day}`; const firstShiftStart = `${todayStr} 08:00:00`; const firstShiftEnd = `${todayStr} 14:00:00`; // 筛选当日数据 const votesforDay = dataAllJson.filter(x => x.Created.startsWith(todayStr)); // 筛选早班时段的Like投票 const likesFirstShift = votesforDay.filter(x => x.Created >= firstShiftStart && x.Created <= firstShiftEnd && x.Choice === "Like").length;
示例验证
你的示例数据Created: "2022-12-21 07:50:04"早于早班开始时间,不会被统计,符合预期。若有一条数据Created: "2022-12-21 08:10:00",修复后的代码会正确将其纳入统计。
内容的提问来源于stack exchange,提问作者Kate

