JavaScript Date 演练场
输入一个 JavaScript Date 表达式,实时探索每一种输出格式和属性 —— toISOString、toString、getTime、getFullYear 等。
JavaScript 的 Date 对象
JavaScript 内置的 Date 对象在内部以自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数存储时间。每个 Date 实例归根结底就是这一个整数。toISOString()、toString()、toLocaleString() 等各种方法只是显示同一底层值的不同方式。
使用 JavaScript 日期时的常见陷阱
Date 的若干行为会让有经验的开发者也犯错:
- 月份从零开始:一月是 0,十二月是 11——显示时务必加 1
- new Date('2024-01-01') 解析为 UTC 午夜;new Date('2024/01/01') 解析为本地午夜
- new Date(2024, 0, 1) 以本地时间构造 2024 年 1 月 1 日(月份从 0 开始)
- Date.now() 返回毫秒;Math.floor(Date.now() / 1000) 得到 Unix 秒
- 不要用加 86400000 ms 来加一天——夏令时可能使其落在错误的时刻
在 JavaScript 中处理时区
JavaScript 的 Date 对象没有时区属性——它始终以 UTC 存储。时区转换在显示时通过 Intl.DateTimeFormat API 完成。
- new Intl.DateTimeFormat('en-US', { timeZone: 'Asia/Tokyo', dateStyle: 'full', timeStyle: 'long' }).format(date)
- date.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
- new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) —— 返回各部分以便自定义格式
如何解读 playground 的输出
playground 以多个视图展示同一个 Date 值,便于快速发现单位与时区错误。先比较 getTime 与 Unix 秒,再查看 ISO 与本地字符串。如果 ISO 日期正确但本地字符串看起来不同,说明时间戳没错,只是显示时区变了。
- getTime 始终是自 Unix 纪元以来的毫秒
- Unix 秒是 getTime 除以 1000 后向下取整
- toISOString 始终以末尾带 Z 的 UTC 显示
- 除非用选项覆盖,toString 与 toLocaleString 以浏览器本地时区显示