演练场

JavaScript Date 演练场

输入一个 JavaScript Date 表达式,实时探索每一种输出格式和属性 —— toISOString、toString、getTime、getFullYear 等。

JavaScript Expression

Type any expression that returns a Date or number.

JavaScript 的 Date 对象

JavaScript 内置的 Date 对象在内部将时间存储为自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。每个 Date 实例归根结底只是这一个整数。各种方法——toISOString()、toString()、toLocaleString()——只是显示同一底层值的不同方式。

处理 JavaScript 日期时的常见陷阱

JavaScript Date 的若干行为会让经验丰富的开发者也栽跟头:

  • 月份从零开始:一月是 0,十二月是 11——显示时务必加 1
  • new Date('2024-01-01') 解析为 UTC 午夜;new Date('2024/01/01') 解析为本地午夜
  • new Date(2024, 0, 1) 以本地时间构造 2024 年 1 月 1 日(月份从零开始)
  • Date.now() 返回毫秒;Math.floor(Date.now() / 1000) 给出 Unix 秒
  • 不要用加 86400000ms 的方式来加天数——DST 可能使其落在错误的时间

在 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 在没有选项覆盖时显示浏览器本地时区