前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 时间戳存储与时区输出
JavaScript数据处理

Date 对象里存的是时间戳还是本地时间?为什么换台电脑打印出来就不一样?

Date 里只存一个数:距离 1970-01-01 UTC 零点的毫秒数,不存「北京时间」还是「纽约时间」。getHours() 和 toString() 这些方法在读取时才按当前机器的时区换算,所以同一个 Date 换台电脑打印出来不一样,但 getTime() 永远相同。

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

一个时间点,多种钟面

  1. 存储内部是一个毫秒数,getTime() 读出来就是它
  2. 本地读取getHours() 和 toString() 按运行环境时区换算后返回
  3. UTC 读取getUTCHours() 和 toISOString() 不做本地换算

两个 Date 的 getTime() 相等,就是同一个时间点,哪怕它们在两台机器上显示的日期都不一样。比较时间先后要比时间戳,别比格式化后的字符串。

核心回答

先记住这个答案

Date 存的是时间戳。准确说,是一个距离 1970-01-01T00:00:00Z 的毫秒数,Date 内部没有任何字段记录时区。时区只在两个时刻起作用:用本地字段构造 Date 时,把本地时间换算成时间戳;调用 getHours() 或 toString() 这类本地方法时,把时间戳换算成本地时间。所以同一个 Date 在北京和纽约打印出来的钟点不同,但 getTime() 完全一样。

  • Date 只存 UTC 毫秒数,不存时区
  • getHours() 和 toString() 按本机时区读
  • UTC 方法和 toISOString() 永远按 UTC 读
  • 输入里写的 +08:00 只参与换算,Date 不会记住它

同一个时间点,两种写法

北京时间早上 8 点和 UTC 零点是同一个时刻。用两种字符串分别构造,存下来的是同一个数。

比较时间戳和 UTC 读取结果JavaScript
const beijing = new Date('2026-09-10T08:00:00+08:00') // 北京早上 8 点
const utc = new Date('2026-09-10T00:00:00Z') // UTC 零点

console.log(beijing.getTime()) // 内部存的毫秒数
console.log(beijing.getTime() === utc.getTime()) // 同一个时间点
console.log(beijing.toISOString()) // 按 UTC 输出
console.log(beijing.getUTCHours()) // UTC 的小时
查看输出与解释
1788998400000
true
2026-09-10T00:00:00.000Z
0

解析 +08:00 时,引擎把 08:00 减去 8 小时得到 UTC 时间,然后只存下这个毫秒数。输入里写的 +08:00 用完就丢了,所以 toISOString() 打印出来的是 Z 结尾的 UTC 时间,而不是你传进去的东八区写法。 这几行在任何时区的机器上跑,结果都一样,因为它们都不涉及本地时区。

本地方法才会让结果随机器变化

像 getHours() 和 getDate(),还有 toString(),这些不带 UTC 的方法,读的时候会用运行环境的时区规则去换算。换一台时区不同的机器,结果就变了。

同一个 Date 在两个时区读JavaScript
const d = new Date('2026-09-10T08:00:00+08:00')

// 在东八区(Asia/Shanghai)运行
d.getHours() // 8
d.getDate() // 10
d.toString() // Thu Sep 10 2026 08:00:00 GMT+0800 (中国标准时间)

// 在 America/New_York 运行
d.getHours() // 20
d.getDate() // 9,已经是前一天了
d.toString() // Wed Sep 09 2026 20:00:00 GMT-0400 (北美东部夏令时间)

纽约这时候用夏令时,比 UTC 慢 4 小时,所以北京的 10 号早上 8 点在纽约还是 9 号晚上 8 点。日期都不一样了,但它们是同一个时刻。 这就是为什么「服务端渲染的时间和浏览器里的不一致」这类 bug 很常见。服务器的系统时区往往是 UTC,用户浏览器是东八区,两边各自调用 getHours() 格式化,结果当然不同。要么统一用 Intl.DateTimeFormat 显式传 timeZone,要么只在客户端格式化。

换算时查的是那个日期当时的规则
本地方法不是简单地加减一个固定偏移,而是查这个时间点在当地的时区规则。同样是纽约,1 月份按 UTC-5 算,7 月份按 UTC-4 算。历史日期也一样,有些地区几十年前的偏移和现在不同,运行时会按时区数据库里当年的规则换算。
回答前,多想一步

容易答错的地方

以为 Date 记住了构造时的时区
输入字符串里的偏移只参与换算,Date 不保留它。后端返回 2026-09-10T08:00:00+09:00,前端 new Date() 之后就再也拿不到 +09:00 了。如果业务需要知道「这是东京的时间」,得把时区单独存一个字段。
把 toString() 的结果当接口格式
toString() 的输出带本机时区名,而且格式随环境变化,本来就是给人调试看的。接口传时间用 toISOString() 或者直接传毫秒数。
试着用自己的话回答

面试官还会怎么问?

两个时区不同的字符串,getTime() 可能相等吗?

可以,只要它们描述的是同一时刻。08:00+08:00 和 00:00Z 解析后毫秒数完全相同,=== 比较 getTime() 结果是 true。

Date 能存 Asia/Shanghai 这种时区名吗?

不能,Date 只有一个时间值。Intl.DateTimeFormat 可以按指定时区格式化,但原始的业务时区要自己用一个字段存下来。新的 Temporal API 里 ZonedDateTime 才会同时带上时区。

为什么 new Date(dateA) - new Date(dateB) 能直接得到毫秒差?

减号会把两个 Date 转成数字,调用的是 valueOf(),返回的就是 getTime() 那个毫秒数。因为存的是时间戳,两个时刻的差值和时区完全无关。

从一道题,走向一组知识

把知识连起来

数据处理

setHours 和 setUTCHours 有什么区别?什么时候结果会不一样?

读取分本地和 UTC 两套方法,修改也一样,那题讲两套 setter 改出来的时间戳有什么不同。

数据处理

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

本地读取和 UTC 读取之间差的那个数,就是 getTimezoneOffset() 返回的分钟数。

参考资料

  • JavaScript:数据处理参考资料

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

本题目录
  1. 先记住这个答案
  2. 同一个时间点,两种写法
  3. 本地方法才会让结果随机器变化
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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