如何让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
相关产品推荐
相关产品推荐

