Unix 时间戳格式详解

所有 Unix 时间戳格式的完整参考 —— 秒、毫秒、微秒、ISO 8601 和 RFC 2822 —— 并附示例说明每种语言和数据库使用哪种格式。

秒级 Unix 时间 — 通用格式

最常见的格式:计数自 1970 年 1 月 1 日 00:00:00 UTC 以来整秒数的 32 位或 64 位整数。目前约 17 亿的 10 位数字。

  • 示例:1700000000 = 2023-11-15 06:13:20 UTC
  • 使用者:Python time.time()、PHP time()、Go time.Now().Unix()、Ruby Time.now.to_i、C time(NULL)
  • 存储为:32 位 int(遗留,最大到 2038 年),64 位 int(现代,可安全数十亿年)
  • 数据库:MySQL UNIX_TIMESTAMP()、PostgreSQL EXTRACT(EPOCH FROM NOW())::BIGINT

毫秒级 Unix 时间 — JavaScript 的格式

自 Unix 纪元以来的毫秒:具备毫秒精度的 13 位整数。这是 JavaScript Date 对象内部使用的格式。

  • 示例:1700000000000 = 2023-11-15 06:13:20.000 UTC
  • 使用者:JavaScript Date.now()、Java System.currentTimeMillis()、.NET DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  • 转换为秒:Math.floor(ms / 1000)
  • 从秒转换:seconds * 1000

ISO 8601 — 人类可读的标准

ISO 8601 是以字符串表示日期与时间的国际标准。与 Unix 时间戳不同,它是自描述的:格式中同时编码了日期/时间和时区偏移。

  • 2023-11-15T06:13:20Z — UTC(后缀 Z 表示 UTC)
  • 2023-11-15T01:13:20-05:00 — 带显式 UTC 偏移(EST)
  • 2023-11-15T06:13:20.000Z — 带毫秒
  • JavaScript:date.toISOString() 始终返回带 Z 后缀的 UTC
  • Python:datetime.isoformat(),Go:time.Format(time.RFC3339)

RFC 2822 — 邮件与 HTTP 日期格式

RFC 2822(用于 HTTP 时也称 RFC 1123)是邮件头和 HTTP 响应中使用的日期格式。JavaScript 的 Date.toUTCString() 返回此格式。

  • 示例:Wed, 15 Nov 2023 06:13:20 GMT
  • 用于:HTTP 响应头(Last-Modified、Date、Expires)、邮件头(Date:)
  • JavaScript:date.toUTCString()
  • 在现代 API 中较少见,但在 Web 基础设施中仍广泛存在

如何识别时间戳格式

当你收到未知的时间戳值时,用以下规则识别其格式:

  • 10 位、以 1 开头 → Unix 秒(如 1700000000)
  • 13 位、以 1 开头 → Unix 毫秒(如 1700000000000)
  • 负数 → 1970 年之前的 Unix 秒或毫秒
  • 含 T 或 Z → ISO 8601(如 2023-11-15T06:13:20Z)
  • 含逗号或星期名 → RFC 2822(如 Wed, 15 Nov 2023 ...)
  • 16 位 → 微秒(除以 1,000,000 得到秒)
  • 19 位 → 纳秒(除以 1,000,000,000 得到秒)

微秒与纳秒

一些高精度系统使用比毫秒更小的单位。它们在应用层代码中罕见,但出现在底层系统、数据库内部和可观测性工具中。

  • 微秒(µs):16 位整数 — Rust SystemTime as_micros()、PostgreSQL clock_gettime()
  • 纳秒(ns):19 位整数 — Go time.Now().UnixNano()、Rust SystemTime as_nanos()
  • PostgreSQL EXTRACT(EPOCH) 返回一个以微秒作为小数部分的浮点数
  • 将纳秒转换为秒:除以 1,000,000,000(1e9)

Unix 时间戳格式常见问题

Unix 时间戳有几位?
现代 Unix 时间戳以秒计为 10 位(约 17 亿),以毫秒计为 13 位。微秒为 16 位,纳秒为 19 位。
Unix 时间与 ISO 8601 有何区别?
Unix 时间是自 1970 UTC 以来的秒或毫秒的单个数字,不含时区。ISO 8601 是像 2023-11-15T06:13:20Z 这样的自描述字符串,编码了日期、时间和偏移。
如何判断时间戳是秒还是毫秒?
数位数:10 位是秒,13 位是毫秒。若某个值转换出接近 1970 年或非常遥远的日期,说明单位读错了。