JavaScript中如何准确对比日期时间,判断给定时间是否已过期?
JavaScript 日期时间精确对比方案
异常原因
对比结果不符合预期的核心原因是时区基准不统一:
- 定义的
givenTime带Z后缀,属于UTC(国际标准时间) - 打印的当前时间
1/8/2021 @ 18:7:21是设备本地时区时间,二者基准不一致才会出现认知偏差 - JS原生
Date对象的大小对比本身会精确到毫秒,并非只能对比日期维度,你遇到的问题是把不同时区的时间字符串做了错误的主观对照。
正确实现方式
方案1:时间戳直接对比(最稳妥,自动处理时区)
Date对象的getTime()方法返回1970年1月1日UTC 0点以来的毫秒数,直接对比该数值即可实现精确到毫秒的校验,无需手动处理时区转换:
const givenTime = '2021-08-01T16:49:08.678Z'; // 给定时间是否晚于当前时间 = 是否未过期 const isNotExpired = new Date(givenTime).getTime() > Date.now(); // 打印统一时区的时间方便人工校验 console.log('给定时间(本地时区):', new Date(givenTime).toLocaleString()); console.log('当前时间(本地时区):', new Date().toLocaleString()); console.log('是否未过期:', isNotExpired);
方案2:自定义精度对比(可选)
如果不需要精确到毫秒,可手动归零低精度位后再对比,比如仅对比到分钟的实现:
function getTimeByPrecision(date, precision = 'second') { const target = new Date(date); target.setMilliseconds(0); if (precision === 'minute') target.setSeconds(0); if (precision === 'hour') target.setMinutes(0); if (precision === 'day') target.setHours(0); return target.getTime(); } const givenTime = '2021-08-01T16:49:08.678Z'; // 按分钟精度校验是否过期 const isNotExpired = getTimeByPrecision(givenTime, 'minute') > getTimeByPrecision(Date.now(), 'minute');
示例场景验证
你给出的测试场景中,givenTime = '2021-08-01T16:49:08.678Z'如果对应东八区(UTC+8)本地时间为2021/8/2 00:49:08,你给出的当前本地时间为2021/8/1 18:07:21,确实早于给定时间,返回true是正确结果,之前的认知误差是把UTC时间的16:49误当成了本地时间的16:49。
内容的提问来源于stack exchange,提问作者Sara Ree
相关产品推荐
相关产品推荐

