Unix 时间戳
Unix 时间戳(Unix timestamp,又称纪元时间、Epoch time)是一个整数,表示从 1970-01-01 00:00:00 UTC(称为「Unix 纪元」)到某一时刻所经过的秒数,且不计入闰秒。例如 0 代表纪元起点,1700000000 对应 2023 年 11 月中旬。它是计算机内部记录时间最常用的方式:一个纯数字,便于存储、比较和做差值运算。
它最大的特点是与时区无关:同一瞬间在全球任何地方对应的时间戳都相同,时区只在把时间戳转换成「年月日时分秒」这种人类可读格式时才起作用。因此后端存储、接口传输时通常直接用时间戳,展示层再按用户所在时区渲染。
使用中需注意几个要点:
- 秒 vs 毫秒:Unix 时间戳标准单位是秒(10 位数字),但 JavaScript 的
Date.now()、Java 的System.currentTimeMillis()返回的是毫秒(13 位),混用会导致时间偏差一千倍。 - 2038 问题:用 32 位有符号整数存储时,会在 2038-01-19 溢出,现代系统应使用 64 位。
- 时间戳本身没有时区信息,转换成本地时间时务必显式指定时区。
常见问题
Unix 时间戳的单位是秒还是毫秒?
标准 Unix 时间戳单位是秒,为 10 位数字。但 JavaScript、Java 等语言的 API 常返回毫秒(13 位),使用前先看数字位数或语言约定,避免相差一千倍。
同一时刻在不同时区,时间戳会不一样吗?
不会。时间戳表示的是一个绝对瞬间,全球都相同,本身不含时区信息。时区只影响把它转成「年月日时分秒」时显示成几点,转换时需显式指定目标时区。
什么是 2038 年问题?
早期系统用 32 位有符号整数存秒数,最大只能表示到 2038-01-19 03:14:07 UTC,之后会溢出变成负数。改用 64 位整数存储即可彻底避免。