部署到Heroku后JavaScript Date出现6小时时间偏移如何解决?
问题根源
- 你使用的
getHours()、getMonth()、getDate()等方法均为本地时区取值方法,返回值依赖运行环境的时区设置:本地运行时返回你所在时区的时间部分,部署到Heroku后返回UTC时区的时间部分,拼接出的日期字符串本身就存在时区差异。 - 不带时区标识的日期字符串传入
new Date()解析时,会默认使用运行环境的本地时区解析,不同时区环境下解析出的时间戳天然存在对应时区偏移的差值,你遇到的6小时偏移就是两个环境的时区差。 - 额外隐藏问题:
getMonth()返回值范围是0-11,你拼接日期时没有加1,会导致月份比实际值小1,也可能引发日期偏差。
解决方案
核心逻辑是所有日期的取值、解析全程统一使用UTC时区,完全屏蔽运行环境的时区影响:
- 所有时间取值统一使用UTC系列方法:
getUTCFullYear()、getUTCMonth()、getUTCDate()、getUTCHours()、getUTCMinutes() - 拼接日期字符串时明确带上
UTC标识,强制new Date()用UTC时区解析,避免解析逻辑依赖环境 - 直接用
Date.getTime()获取时间戳,无需冗余的toUTCString()+Date.parse()转换
修正后代码示例
// 计算当前日期时间 const currentDate = new Date(); // 全部使用UTC方法取值,getUTCMonth要+1修正0基值 const time = `${currentDate.getUTCHours()}:${currentDate.getUTCMinutes()}`; const fullDate = `${currentDate.getUTCMonth() + 1}/${currentDate.getUTCDate()}/${currentDate.getUTCFullYear()}`; // 拼接时加UTC后缀,明确解析时区 const currentDateFormatted = new Date(`${fullDate} ${time} UTC`); const currentParsedDateToUTC = currentDateFormatted.getTime(); // 计算活动日期时间 // 注意:如果event.date、event.endTime是用户在本地时区录入的值,需提前转成UTC对应的时间字符串再存储,或录入时同步存储时区偏移量做转换 const eventDate = new Date(`${event.date} ${event.endTime} UTC`); const eventParsedDateToUTC = eventDate.getTime(); const isExpired = currentParsedDateToUTC > eventParsedDateToUTC;
内容的提问来源于stack exchange,提问作者Jayg713
相关产品推荐
相关产品推荐

