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

如何比较JSON日期并筛选指定时段数据?代码异常求助

日期筛选投票数据问题排查

问题概述

尝试筛选当日早班(8:00-14:00)内标记为"Like"的投票数据,但最终筛选结果为空数组。其中votesforDay能正确返回当日所有记录,但后续针对早班时段的筛选失效。

核心问题原因

  1. 字符串日期比较的逻辑漏洞
    直接用字符串格式的日期进行大小比较,依赖字符串字典序,当日期格式不一致时会出错。比如firstShiftStart生成的是"2022-12-21 8:00:00"(小时为一位数),而数据中的Created字段是"2022-12-21 08:10:00"(小时为两位数),字符串比较时"08"会被判定为小于"8",导致本该被包含的记录被排除。

  2. 无效的八进制数字写法
    代码中08是无效八进制数字(八进制仅允许0-7),非严格模式下会被解析为0,导致firstShiftStart的小时部分变为0,彻底偏离预期的早班开始时间。

  3. 日期格式不统一
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:35:18