时间戳是程序之间传递时间最常用的格式:一个整数,没有时区歧义。但联调时踩坑的人不在少数,问题集中在位数、时区和换算上。
坑一:秒与毫秒不分
Unix 时间戳标准单位是秒(10 位整数),但很多系统(尤其 JavaScript 的 Date.now())输出的是毫秒(13 位)。把 13 位当秒解析会得到一个几万年后的日期。判断方法:10 位是秒,13 位是毫秒。
1700000000 → 2023-11-15 06:13:20(北京时间) 1700000000000 → 同一个时刻的毫秒表示
坑二:时区换算
时间戳本身与时区无关——它表示的是从 1970-01-01 00:00:00 UTC 起算的秒数。同一个时间戳,在北京是早上 6 点,在伦敦是晚上 10 点。接口文档里通常按 UTC 存储,展示时才转本地时区。
坑三:闰秒与 2038 问题
绝大多数系统忽略闰秒,按 86400 秒/天计算即可。32 位系统存秒级时间戳会在 2038-01-19 溢出(著名的 2038 问题),现代 64 位系统没有此问题。
Q:怎么快速把接口里的时间戳转成日期?
直接粘贴到时间戳转换工具,自动识别秒/毫秒,同时给出北京时间与 UTC 对照。
Q:为什么有的时间戳是负数?
1970 年以前的时间用负数表示,属于正常现象。
提示
联调时先确认对方字段是秒还是毫秒,再确认时区口径,能省掉 80% 的扯皮。
