为何new Date.getTimezoneOffset()返回错误结果?
为何new Date.getTimezoneOffset()返回错误结果?
看起来你遇到的问题有点绕,先帮你理清楚getTimezoneOffset()的逻辑,再分析可能的原因~
首先得明确这个方法的核心规则:它返回的是UTC时间减去本地时间的分钟数,简单翻译成人话就是:
- 如果你的本地时区是GMT+X,返回值就是
-X*60 - 如果是GMT-X,返回值就是
X*60
接下来拆解你的例子:
你提到基辅昨天是冬令时GMT+3,今天切换后是GMT+2?这里可能你搞反了欧洲夏令时的规则哦!欧洲大部分地区(包括基辅、巴黎)的夏令时是在3月最后一个周日把时钟拨快1小时——冬令时是GMT+2,夏令时切换后会变成GMT+3。
你用toLocaleString验证的基辅时间是31/03/2024, 10:07:28,伦敦时间是08:07:07,两者相差2小时——这其实是对的:3月31日伦敦也同步切换到了夏令时(GMT+1),基辅此时是GMT+3,刚好差2小时。这时候getTimezoneOffset()返回-180(也就是-3*60)是完全正确的,因为本地时间比UTC早3小时,UTC = 本地时间 - 3小时,所以UTC减去本地时间的结果就是-180分钟。
你误以为应该返回-120,其实是把冬夏令时的偏移搞反啦!
再看你切换到巴黎的情况:巴黎夏令时切换后是GMT+2,所以getTimezoneOffset()返回-120(-2*60)是正确的,你预期的-60是冬令时的偏移,但3月31日巴黎已经进入夏令时了,所以是你的预期出现了偏差~
当然,如果排除了认知偏差后还是出现异常,那可能是以下技术原因:
- 系统时区数据未更新:你的操作系统时区数据库可能没同步到最新的夏令时规则,导致JS读取的时区信息有误。可以尝试更新系统时区数据,或者重启设备试试。
- JS引擎时区库滞后:不同浏览器或Node.js版本使用的IANA时区数据库版本不同,如果版本较旧,可能没包含最新的时区调整(比如某些地区夏令时规则变更),可以尝试升级浏览器或Node.js版本。
- 缓存或进程问题:如果是浏览器环境,可能页面缓存了旧的时区信息,试试清空缓存或打开隐私窗口;如果是Node.js,重启进程让时区设置生效。
备注:内容来源于stack exchange,提问作者Yevgen
相关产品推荐
相关产品推荐

