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+ 都支持。