技术科普
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 的第一步。