JavaScript指定时间打印True的日期相等判断问题排查
问题根因
你的代码无法触发true打印是两个JS基础特性导致的:
Date是引用类型,用==/===比较两个独立创建的Date实例时,比较的是两个对象的内存地址,不是内部存储的时间值,哪怕两个实例代表的时间完全一致,比较结果也永远是false。setInterval的1000ms触发间隔不是绝对精准的,受事件循环调度、主线程任务阻塞影响,回调实际执行时间和预期时间会有毫秒级偏差,就算你修正了比较逻辑,卡「时间完全相等」的判断也大概率会错过触发点。
正确实现代码
核心修改点是把比较逻辑改成时间戳的大小判断,只要当前时间到达/超过目标时间就触发逻辑,触发后清除定时器避免无效轮询:
// 预先解析目标时间的毫秒时间戳,避免每次回调重复计算 const targetTimestamp = new Date("2022-06-18T06:27:00").getTime(); const checkTimer = setInterval(() => { const currentTimestamp = Date.now(); if (currentTimestamp >= targetTimestamp) { console.log("true"); // 触发后清除定时器,终止轮询 clearInterval(checkTimer); } else { console.log("false"); } }, 1000);
补充注意事项
- 如果需要固定时区解析目标时间,建议在时间字符串后缀加时区标识:比如UTC时间加
Z即"2022-06-18T06:27:00Z",东八区时间可以写为"2022-06-18T06:27:00+08:00",避免不同运行环境时区差异导致触发时间不对。 - 所有时间值比较场景,都建议先转成数字类型的毫秒时间戳再对比,不要直接比较Date对象实例。
- 定时轮询类的时间触发逻辑,永远不要用「相等」作为判断条件,必须用「大于等于目标值」的判断逻辑,从根本上规避定时器调度误差导致的漏触发问题。
内容的提问来源于stack exchange,提问作者Ali Hsaino
相关产品推荐
相关产品推荐

