Unix 时间戳和 ISO 8601 怎么选
一句话结论
存储和计算用 Unix 时间戳(整数,无时区歧义),接口传输和日志给人看用 ISO 8601(自带时区、可读)。最稳妥的做法是:数据库存时间戳或带时区的 timestamptz,接口输出 ISO 8601 带 Z 标识的 UTC 时间。
核心区别对照
| 示例 | Unix 时间戳 | ISO 8601 |
|---|---|---|
| 本质 | 从 1970-01-01 UTC 起的秒数 | 带时区标记的字符串 |
| 时区信息 | 不含,隐含 UTC | 明确(Z 或 +08:00) |
| 可读性 | 差,人看不出是什么时候 | 好,一眼能读 |
| 存储成本 | 4-8 字节整数 | 20-30 字节字符串 |
| 比较与计算 | 直接数值比较,最快 | 需先解析,同格式下字典序可比 |
| 2038 年问题 | 32 位整数会溢出 | 无此问题 |
Unix 时间戳
一个整数,表示从 1970-01-01 00:00:00 UTC 起经过的秒数(毫秒版本是 13 位)。它不含时区,天然是 UTC,比较大小就是比较整数,排序和范围查询极快,存储也最省。缺点是人对着一串数字看不出日期,而且 32 位整数会在 2038 年 1 月溢出——新系统务必用 64 位。
ISO 8601
形如 2026-01-27T08:26:40Z 的字符串,格式固定、自带时区(Z 表示 UTC,+08:00 表示偏移),人可以直读,而且同格式下字典序等于时间序,字符串排序即可排序。它是 JSON 接口、日志文件、HTTP 头的事实标准。缺点是体积大、比较前需解析。
怎么选
- 数据库存储、高效范围查询 → Unix 时间戳或 timestamptz
- 接口返回、日志、配置文件 → ISO 8601,带 Z 或明确偏移
- 前端展示 → 拿到 ISO 8601 后按用户本地时区格式化
相关工具
常见问题
秒和毫秒怎么区分
10 位是秒,13 位是毫秒。混用会导致时间相差 1000 倍,是接口对接里最常见的坑之一。
Z 是什么意思
Z 代表 UTC 零时区(Zulu time)。2026-01-27T08:26:40Z 就是 UTC 时间的这个时刻,等价于北京时间 16:26:40。
2038 年问题真的会发生吗
会,但只影响把时间戳存成 32 位有符号整数的老系统。用 64 位整数或数据库的 timestamptz 类型即可规避。