纪元时间戳详解:Unix 时间、POSIX 时间与自 1970 年起的秒

纪元时间戳是把某个时刻表示为自固定起点以来经过时间的紧凑方式。本指南解释 Unix 时间、POSIX 时间戳、Unix 纪元日期,以及为什么自 1970 年 UTC 起的秒成为软件中的默认值。

什么是 epoch 时间戳?

epoch 时间戳是从一个称为 epoch 的固定参考时刻起测量的数字计数。在开发者日常用法中,epoch 时间戳通常指 Unix 时间戳:自 1970 年 1 月 1 日 00:00:00 UTC 起的秒数。值为 0 即精确的 Unix 纪元。正值在 1970 年之后,负值在之前。

Unix 时间 vs POSIX 时间戳

在应用代码中,Unix 时间和 POSIX 时间戳通常可互换使用。两者都指自 Unix 纪元起经过的秒数,为简化民用时间而忽略闰秒。实际结果是一个稳定的整数,可跨操作系统、语言、数据库、API 和日志文件使用。

  • Unix 纪元日期:1970-01-01 00:00:00 UTC
  • Unix 时间戳 0:Unix 纪元的精确起点
  • POSIX 时间戳:POSIX 兼容系统中自 Unix 纪元起的秒
  • epoch 毫秒:同一纪元,但以毫秒计
  • epoch 微秒或纳秒:用于数据库与追踪的更高精度

为什么以 1970 年为起点的时间戳成为标准

Unix 纪元对早期 Unix 系统很实用,随着 Unix 思想扩展到 C 库、Linux、数据库、Web 服务器和编程语言,它成为约定。单个数字时间戳比本地化的日期字符串更易于排序、比较、传输和存储。

epoch 时间戳示例

几个已知的值能让定义更容易记住。

  • 0 = 1970-01-01 00:00:00 UTC
  • 1 = 1970-01-01 00:00:01 UTC
  • 86400 = 1970-01-02 00:00:00 UTC
  • 1700000000 = 2023-11-14 22:13:20 UTC
  • 1767225600 = 2026-01-01 00:00:00 UTC

epoch 时间戳常见问题

epoch 时间和 Unix 时间一样吗?
在开发者常见用法中,是的。epoch 时间通常指 Unix 时间:自 1970-01-01 00:00:00 UTC 起经过的秒数。
Unix 时间的定义是什么?
Unix 时间定义为自 1970-01-01 00:00:00 UTC 起的秒数,不计闰秒。
POSIX 时间戳是否带时区?
不带。POSIX 时间戳表示一个瞬间。只有在把该瞬间格式化为可读日期时才应用时区。
epoch 时间戳在 Windows、Linux 和 macOS 上一样吗?
Unix 纪元(1970-01-01 00:00:00 UTC)在现代平台和语言中是一致的,因此同一瞬间在各处都得到相同的 Unix 时间戳。Windows 内部使用自己的 FILETIME 纪元(1601),但标准的 Unix 和 POSIX 时间戳使用 1970 年。