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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 08:51:02