Unix 时间戳是从 1970 年 1 月 1 日 00:00:00 UTC 起算的秒数,不带时区、方便比较和存储,被日志、数据库和接口广泛使用。这个工具支持时间戳与日期时间双向转换、秒/毫秒切换,并同时显示 UTC 与本地时间。用之前先记住一件事:10 位是秒,13 位是毫秒,差 1000 倍。
时间戳从 1970-01-01 00:00:00 UTC 起算
Unix 时间戳(Unix timestamp)的定义很直接:从 1970 年 1 月 1 日 00:00:00 UTC 这个时刻开始,到现在经过的秒数,这个起点被称为"Unix 纪元"(epoch)。比如时间戳 0 对应 1970-01-01 00:00:00 UTC,换算成北京时间是 1970-01-01 08:00:00;时间戳 1000000000 对应 2001-09-09 01:46:40 UTC,北京时间则是 2001-09-09 09:46:40。有一点容易被忽略:Unix 时间戳不计算闰秒。UTC 至今已插入过 27 个闰秒,但系统时间靠"每天固定 86400 秒"来算,闰秒被摊平或忽略,所以时间戳与物理上"实际流逝的秒数"会有细微出入,日常使用无感。
10 位是秒、13 位是毫秒:接口调试最常踩的坑
同一个时间点,用秒记是 10 位数,用毫秒记是 13 位数,两者相差 1000 倍——这是接口联调里最高频的错误。判断方法很实用:数位数。10 位(如 1700000000)是秒,13 位(如 1700000000000)是毫秒。现在(2020 年代)的秒级时间戳都是 10 位,要到公元 2286 年才会涨到 11 位;毫秒级则是 13 位,要到 2286 年才变 14 位。典型的坑是:前端 JavaScript 传了毫秒给只认秒的后端,结果时间直接跳到几万年以后;或者把秒当毫秒处理,日期退回到 1970 年 1 月。本工具支持秒/毫秒一键切换,输入时先确认自己拿到的是哪一种。
2038 年问题:32 位整数在 03:14:07 溢出
如果时间戳用 32 位有符号整数存储,它能表示的最大值是 2,147,483,647。把这个数换算成时间,就是 2038 年 1 月 19 日 03:14:07 UTC(北京时间同日 11:14:07)。再往后加一秒,整数就会溢出、翻成负数,日期直接跳回 1901 年——这就是"2038 年问题"(Year 2038 problem)。受影响的主要是仍用 32 位 time_t 的老系统、老数据库和嵌入式设备。现代系统大多已改用 64 位存储时间戳,理论上可表示到约 2920 亿年后,实际不会再遇到这个问题。但如果你的项目还在维护老代码,值得提前排查。
为什么日志、数据库、接口都爱存时间戳
时间戳被广泛采用,核心原因是它"与时区无关"。同一个时刻,北京时间写"2026-09-30 12:00"、纽约写"2026-09-29 23:00",字符串形式在不同系统间传递很容易因为时区理解不一致而错乱;而时间戳是一个纯数字,全世界指向同一个瞬间,谁都不会读错。其次,它是一个整数,可以像数字一样直接比较大小、排序、做减法算时间差,不需要解析日期格式。第三,它占用的存储小(64 位整数 8 字节,远小于 ISO 8601 字符串),索引和查询也更快。日志按时间排序、数据库存创建时间、接口传时间参数,几乎都用时间戳,就是这三点决定的。
JavaScript 的 Date.now() 返回的是毫秒
这是前后端协作里最容易出错的一处:JavaScript 的 Date.now() 返回的是毫秒级时间戳(13 位),而很多后端语言(Python、PHP、Go 的 Unix() 等)默认处理秒级时间戳(10 位)。所以前端把 Date.now() 的结果直接发给后端,对方若不除以 1000 就会把时间算到几万年后;反过来,后端返回 10 位秒级时间戳,前端直接 new Date(1700000000) 会得到 1970 年 1 月 20 日,而不是你以为的 2023 年 11 月。正确做法是:拿到秒就乘 1000 再传给 new Date(),拿到毫秒就除以 1000 再给后端。写接口时在文档里明确标注单位是"秒"还是"毫秒",能省掉大量联调时间。
UTC+8:同一个时间戳,北京比伦敦早 8 小时
时间戳本身不带时区,显示成什么时间,取决于你用哪个时区去换算。中国大陆统一使用东八区(UTC+8),也就是比 UTC 早 8 小时,换算偏移量是 28800 秒。所以时间戳 0 在 UTC 下是 1970-01-01 00:00:00,在北京时间下就是 1970-01-01 08:00:00。再看时间戳 1700000000:UTC 是 2023-11-14 22:13:20,北京时间是 2023-11-15 06:13:20。做跨境业务、看服务器日志时尤其要注意——很多服务器记录的是 UTC,直接当成本地时间读会差 8 小时。本工具同时显示 UTC 与本地时间,两边对照就不容易读错。
延伸阅读:世界时钟(多时区对照)
参考资料
常见问题
Unix 时间戳是什么?
从 1970-01-01 00:00:00 UTC 起算、到某个时刻经过的秒数,不含闰秒。它是个与时区无关的整数,全球指向同一瞬间。
10 位和 13 位时间戳有什么区别?
10 位是秒级,13 位是毫秒级,相差 1000 倍。现在的秒级时间戳都是 10 位(到 2286 年才变 11 位),毫秒级是 13 位。联调时先数位数,能避免时间跳到几万年后。