技术科普

JavaScript 时区处理:从 Date 到 Temporal

JavaScript 的 Date 对象内部以 UTC 毫秒数存储时间,但许多方法返回本地时间,容易造成时区混淆。

Date 的局限

  • getHours() 等方法依赖运行环境时区
  • getTimezoneOffset() 返回本地与 UTC 的分钟差
  • 无法直接指定任意时区进行格式化
  • 解析字符串时行为不一致

Intl.DateTimeFormat

现代浏览器支持通过 Intl.DateTimeFormat 指定时区:

new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai' }).format(date)

它适合展示,但不便于计算。获取时区名称可用 Intl.DateTimeFormat().resolvedOptions().timeZone。

Temporal API

Temporal 是新的日期时间 API,提供 ZonedDateTime、Instant、PlainDateTime 等类型,明确区分时间轴上的瞬间与本地时间。它支持时区运算和夏令时处理,但需注意浏览器兼容性。

实践建议

  • 存储和传输使用 UTC 或带偏移的 ISO 8601 字符串
  • 展示时再转换为目标时区
  • 复杂时区运算可使用 Luxon、date-fns-tz 等库
  • 不要手动加减小时来换算时区,夏令时会导致错误

理解 Date 的本地/UTC 双重性,是避免 JavaScript 时区 bug 的第一步。