Unix 时间戳是什么:秒级与毫秒级时间戳换算原理

Unix 时间戳是什么:秒级与毫秒级时间戳换算原理

Unix 时间戳是计算机世界里最通用的时间表示方式。它与时区无关,记录的是一个绝对时刻,因此在跨时区存储、日志分析和接口对接中被广泛使用。

时间戳的定义

Unix 时间戳是从 1970 年 1 月 1 日 00:00:00 UTC(协调世界时)起,到某一时刻所经过的秒数,不含闰秒。这个起点被称为 Unix 纪元(Epoch)。因为这个定义以 UTC 为基准,所以它描述的是一个绝对瞬间:同一时刻在全球任何一个时区得到的时间戳完全相同,不会因为你在东京还是伦敦而变化。

10 位与 13 位的区别

常见的时间戳有两种精度:10 位为秒级,精确到秒;13 位为毫秒级,精确到毫秒,数值上等于秒级时间戳乘以 1000。多数服务端语言(如 PHP、Python、Go)默认使用秒级,而 JavaScript 的 Date.now() 返回毫秒级。跨语言对接时如果不留意位数差异,换算结果会相差整整一千倍,这是时间戳处理中最常见的问题。

时间戳与时区的关系

时间戳本身不带时区信息。只有当你需要把它显示成人类可读的日期时间时,才需要指定用哪个时区来呈现。换算为北京时间时,按 UTC/GMT +8.00 东八区区时计算,该时间基准由中国科学院国家授时中心发布。反过来,把一个北京时间日期转换为时间戳时,也必须明确它是东八区时间,否则会得到相差 8 小时的结果。

常见使用场景

时间戳在程序开发中用途广泛:数据库按时间戳排序比按字符串日期排序更快也更可靠;接口传输时间戳可以避免时区歧义和格式解析问题;日志分析用时间戳能精确计算耗时与间隔;缓存过期、令牌有效期等也都以时间戳形式记录。把时间戳与人可读的日期互相转换,是开发者日常最频繁的操作之一。

2038 年问题

在 32 位系统上,时间戳以有符号 32 位整数存储,最大可表示到 2038 年 1 月 19 日,之后会发生溢出。这就是著名的“2038 年问题”。现代 64 位系统使用 64 位整数存储时间戳,可表示的时间范围远超人类文明尺度,因此不再受此限制。