JavaScript Date 演练场能让你快速看清:当前这个浏览器是怎么解析、存储和格式化一个日期值的。当某个时间戳看着挺正常、行为却和周围代码对不上时,来这里试一试。
值得动手试的几个实验
- 对比 new Date(1700000000) 和 new Date(1700000000 * 1000)。
- 把同一个瞬间分别按 UTC 和某个具名 IANA 时区格式化。
- 对比“只有日期”的字符串和“日期加时间但没有时区偏移”的字符串。
- 分别看看 getTime()、toISOString() 和本地化格式化各自给出什么。
Date 内部只存一个毫秒数。麻烦几乎都出在输入和显示这两个边界上:漏掉的偏移、秒与毫秒的混淆,或者一个悄悄生效的本地时区。演练场的作用,就是把这些选择放在一个安全的地方摊开来看。
Frequent questions:
- Q: JavaScript 的 getMonth() 为什么从 0 开始?
- A: JavaScript 的 Date.getMonth() 用 0 表示一月、11 表示十二月。这个设计是 1990 年代从 Java 的 java.util.Date 继承过来的。给用户展示月份时,记得加 1:date.getMonth() + 1。
- Q: new Date('2024-01-01') 和 new Date('2024/01/01') 有什么区别?
- A: new Date('2024-01-01') 是 ISO 8601 格式,会被解析成 UTC 的零点(00:00:00Z)。而 new Date('2024/01/01') 是非标准格式,大多数浏览器会把它当成你本地时区的零点。想要行为可预期,请始终使用带明确时区偏移的 ISO 8601。
- Q: 不用第三方库,怎么把 Date 格式化成指定时区?
- A: 用内置的 Intl.DateTimeFormat:new Intl.DateTimeFormat('zh-CN', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)。所有现代浏览器和 Node.js 13+ 都支持。