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

如何让getTime()方法适配本地时间?网站活动横幅日期校验问题

活动横幅时区偏差修复方案

问题背景

开发网站活动横幅功能时,需要在指定起止日期内展示横幅,但现有判断函数存在时区偏差:

原代码:

function checkCampaignActive() {
  const campaignDateStart = new Date('2022-09-14');
  const campaignDateStop = new Date('2022-09-15');
  const today = Date.now();

  const isCampaignStarted = today >= campaignDateStart.getTime();
  const isCampaignExpired = today > campaignDateStop.getTime();

  this.isCampaignActive = isCampaignStarted && !isCampaignExpired;

  console.log('Is started: ', isCampaignStarted);
  console.log('Is expired: ', isCampaignExpired);

  console.log(isCampaignActive);
}

checkCampaignActive();

问题根源:new Date('YYYY-MM-DD')格式的字符串会被默认解析为GMT时区的0点,但实际需要按用户本地时区判断,导致活动起止时间和预期不符。

最简修复方法

直接使用new Date(year, monthIndex, day)的构造方式,该方式会按本地时区创建日期对象,完美对齐本地时间的判断逻辑:

修改后的代码:

function checkCampaignActive() {
  // 按本地时区创建起止日期(注意月份是0索引:9月对应8)
  const campaignDateStart = new Date(2022, 8, 14);
  const campaignDateStop = new Date(2022, 8, 15);
  const today = Date.now();

  const isCampaignStarted = today >= campaignDateStart.getTime();
  const isCampaignExpired = today > campaignDateStop.getTime();

  this.isCampaignActive = isCampaignStarted && !isCampaignExpired;

  console.log('Is started: ', isCampaignStarted);
  console.log('Is expired: ', isCampaignExpired);

  console.log(this.isCampaignActive); // 修正原代码中遗漏的this
}

checkCampaignActive();

关键说明

  • JavaScript的Date构造函数中,月份参数是0索引(0代表1月,1代表2月,以此类推),所以9月需要传入8,这是容易踩坑的点。
  • 这种方式创建的日期对象,会以本地时区的YYYY-MM-DD 00:00:00作为时间起点,和Date.now()返回的本地时间戳对比时,不会存在时区偏差。

内容的提问来源于stack exchange,提问作者Razvan Zamfir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:50:40