前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库JavaScript Date getTimezoneOffset 时区偏移
JavaScript数据处理

getTimezoneOffset 在北京为什么返回 -480,而不是 8?

getTimezoneOffset() 返回「UTC 减本地时间」的分钟数。北京比 UTC 快 8 小时,所以是 -480,单位是分钟,符号和 UTC+8 相反。它还和调用的那个日期有关,有夏令时的地区冬天夏天返回值不一样。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#数据处理
先看核心答案读代码示例
理解线索

偏移属于某个时间点,不属于用户

  1. 计算方向UTC 减本地时间,本地比 UTC 快就是负数
  2. 和日期有关调用哪个 Date,就按那个时刻当地的规则算
  3. 信息有限一个偏移值对应很多时区,推不出 Asia/Shanghai 这种名字

同一时刻偏移相同的地区,夏令时规则可能完全不同。只存一个 -300,不知道它是纽约冬天还是某个没有夏令时的地方,未来的时间就算不准。

核心回答

先记住这个答案

date.getTimezoneOffset() 返回的是 UTC 时间减去本地时间的分钟数。北京是 UTC+8,本地比 UTC 快 480 分钟,UTC 减本地就是 -480。所以记住两点:单位是分钟,不是小时;符号和 UTC+8 的写法相反,本地比 UTC 快就是负数,比 UTC 慢就是正数。另外它是按调用的那个 Date 算的,纽约冬天返回 300,夏天返回 240,不能当成用户的固定属性缓存起来。

  • 单位是分钟,东八区返回 -480
  • 符号和 UTC+8 这种写法相反
  • 有夏令时的地区,不同日期返回值不同
  • 拿时区名要用 Intl,不能靠偏移推断

冬天和夏天调用结果不同

很多人以为 getTimezoneOffset() 是「用户时区的偏移」,其实它是「这台机器在这个时刻的偏移」。换个日期调用,结果可能就变了。

同一台机器,不同日期JavaScript
const winter = new Date('2026-01-15T12:00:00Z')
const summer = new Date('2026-07-15T12:00:00Z')

// 在东八区(Asia/Shanghai)运行:中国没有夏令时
winter.getTimezoneOffset() // -480
summer.getTimezoneOffset() // -480

// 在 America/New_York 运行:夏天用夏令时,快了一小时
winter.getTimezoneOffset() // 300,即 UTC-5
summer.getTimezoneOffset() // 240,即 UTC-4

纽约冬天比 UTC 慢 5 小时,UTC 减本地是正的 300 分钟。夏天拨快一小时后,只慢 4 小时,变成 240。 所以页面启动时读一次偏移,然后拿它去换算全年的时间,在有夏令时的地区一定会错一半。每个时间点要用它自己那个 Date 去调用,或者干脆交给 Intl.DateTimeFormat 按时区名处理。 还有一点:结果只看运行环境的时区,和构造 Date 时写的偏移无关。new Date('2026-09-10T08:00:00+09:00').getTimezoneOffset() 在北京的机器上跑,返回的还是 -480,而不是东京的 -540。

把它格式化成 UTC+08:00

要在界面上显示「UTC+08:00」这种格式,先把符号翻过来,再拆成小时和分钟。别直接除以 60 就完事,世界上还有半小时和 45 分钟的时区。

翻转符号并保留分钟JavaScript
function formatOffset(offset) {
  // offset 是 getTimezoneOffset() 的返回值
  const minutes = -offset // 翻转成「本地减 UTC」
  const sign = minutes >= 0 ? '+' : '-'
  const abs = Math.abs(minutes)
  const hh = String(Math.floor(abs / 60)).padStart(2, '0')
  const mm = String(abs % 60).padStart(2, '0')
  return `UTC${sign}${hh}:${mm}`
}

console.log(formatOffset(-480)) // 北京
console.log(formatOffset(300)) // 纽约冬天
console.log(formatOffset(-330)) // 印度
console.log(formatOffset(-345)) // 尼泊尔
查看输出与解释
UTC+08:00
UTC-05:00
UTC+05:30
UTC+05:45

印度是 UTC+5:30,尼泊尔是 UTC+5:45。如果只写 offset / 60,印度会显示成 -5.5,符号错了,格式也不对。

为什么这个方法要设计成反的
getTimezoneOffset() 的含义是「本地时间加上这个数就得到 UTC」。北京时间 08:00 加上 -480 分钟,就是 UTC 的 00:00。这个方向在做换算时是顺的,只是和人们平时说的 UTC+8 反了。记不住的话,用北京举例推一遍就行:北京快,UTC 减北京是负数。
回答前,多想一步

容易答错的地方

以为东八区返回 480 或者 8
单位是分钟,方向是 UTC 减本地。东八区返回 -480,展示成 UTC+8 时要先取负再除以 60。
用偏移值推断用户所在地
同一个偏移对应很多地区。-480 可能是北京,也可能是新加坡、珀斯。这些地方现在偏移一样,历史规则和未来政策却不一定一样。要知道用户的时区,应该拿时区名,而不是偏移。
试着用自己的话回答

面试官还会怎么问?

怎么拿到用户时区的名字?

Intl.DateTimeFormat().resolvedOptions().timeZone,返回 Asia/Shanghai、America/New_York 这种 IANA 名称。它反映的是浏览器或系统设置,用户可能在出差,涉及排期的功能最好让用户确认一下。

服务端和浏览器拿到的偏移为什么不一样?

getTimezoneOffset() 读的是运行环境的时区。服务器容器通常设成 UTC,返回 0;用户浏览器在北京,返回 -480。SSR 页面里用它算出来的时间,在服务端和客户端就对不上,会导致 hydration 报错。

要保存用户的时区设置,存偏移还是存时区名?

存时区名。偏移只描述某一个时刻,夏令时一切换就过期了。存了 America/New_York,任何时候都能按当时的规则算出正确的偏移;存了 -300,到了夏天就差一小时。

从一道题,走向一组知识

把知识连起来

数据处理

为什么 toISOString 打出来的时间比北京时间少 8 小时,toLocaleString 却是对的?

toISOString() 和本地输出之间差的钟点,就是 getTimezoneOffset() 这个数换算成的小时。

数据处理

文件开头带 BOM 时,TextDecoder 会怎么处理?ignoreBOM 是什么意思?

都是隐藏在数据背后、容易理解反的约定:一个符号和直觉相反,一个选项名的意思和字面相反。

参考资料

  • JavaScript:数据处理参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 冬天和夏天调用结果不同
  3. 把它格式化成 UTC+08:00
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑