如何用原生JS正确判断日期是否过期?当前代码仅按日校验存问题
原生JS全时间维度判断日期是否过期的正确实现
原代码的问题分析
- 重复修改同一Date实例导致逻辑错误:
setDate方法会直接修改原Date对象的时间,你先执行add_day = date.setDate(date.getDate() + 1)时,原date已变为明天的时间;再执行minus_day = date.setDate(date.getDate() - 2),实际是在明天的基础上减2天,得到的是昨天的时间戳,完全偏离了“当前日期减2天”的预期。 - 判断逻辑错误:代码中仅对比两个修改后的日期,而非目标日期与当前时间的关系,且过期判断条件完全写反——过期应该是目标日期早于当前时间,而非两个日期互比大小。
正确实现思路
要实现包含时分秒的全时间维度校验,核心是直接对比时间戳或Date对象本身:Date对象本质是存储从1970年1月1日00:00:00 UTC到该日期的毫秒数,对比时会自动兼顾时分秒的差异。
代码示例
修复原代码的错误写法
// 保留当前时间的原始实例 const now = new Date(); // 生成明天同一时间的独立实例(不修改原now) const addDay = new Date(now); addDay.setDate(now.getDate() + 1); // 生成两天前同一时间的独立实例 const minusDay = new Date(now); minusDay.setDate(now.getDate() - 2); // 打印带时分秒的日期信息 console.log(addDay.toLocaleString(), '| 明天此时'); console.log(minusDay.toLocaleString(), '| 两天前此时'); // 判断minusDay是否过期(早于当前时间则过期) if (minusDay < now) { console.log('minusDay 已过期'); } else { console.log('minusDay 未过期'); } // 判断addDay是否过期 if (addDay < now) { console.log('addDay 已过期'); } else { console.log('addDay 未过期'); }
通用过期判断函数
// 通用函数:判断目标日期是否过期(目标日期早于当前时间则返回true) function isDateExpired(targetDate) { // 处理字符串格式的日期输入 const target = typeof targetDate === 'string' ? new Date(targetDate) : targetDate; // 校验是否为有效日期 if (isNaN(target.getTime())) { throw new Error('传入的不是有效日期'); } const now = new Date(); // 直接对比时间戳,自动包含时分秒维度 return target.getTime() < now.getTime(); } // 测试用例 const twoDaysAgo = new Date(); twoDaysAgo.setDate(twoDaysAgo.getDate() - 2); console.log(isDateExpired(twoDaysAgo)); // true(已过期) const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); console.log(isDateExpired(tomorrow)); // false(未过期) console.log(isDateExpired("2020-01-01 12:00:00")); // true(已过期)
关键注意点
- 每次创建新的Date实例:
new Date(now)会复制当前时间的对象,修改新实例不会影响原时间。 - 直接对比Date对象:
<、>等运算符会自动转换为时间戳对比,无需手动提取时分秒。 - 校验日期有效性:通过
isNaN(target.getTime())排除无效日期输入,避免逻辑异常。
内容的提问来源于stack exchange,提问作者user21339222
相关产品推荐
相关产品推荐

