Unix Timestamp 表示从 1970-01-01 00:00:00 UTC 起经过的时间。数字通常不含时区,单位决定转换后是否为预期日期。
经典错误是相差 1000 倍:一个系统发秒,另一个按毫秒读,结果落在 1970 或遥远未来。位数有助诊断,明确单位更可靠。
Epoch 与时区
时间戳 0 表示 UTC Epoch,正数在之后,平台支持的负数在之前。
时区在向人展示时介入。上海和纽约会为同一瞬间显示不同钟表时间;重复本地日程需要时区数据库。
秒、毫秒与微秒
传统 Unix 时间用秒,JavaScript Date 用毫秒,日志和 Trace 可能用微秒或纳秒。裸数字无法说明单位。
当前日期通常是 10 位秒、13 位毫秒、16 位微秒;远期日期会破坏该启发式。
| 单位 | 当前位数 | 转毫秒 |
|---|---|---|
| 秒 | 10 | × 1,000 |
| 毫秒 | 13 | 不变 |
| 微秒 | 16 | ÷ 1,000 |
| 纳秒 | 19 | ÷ 1,000,000 |
JavaScript 转换
new Date(number) 把数字当毫秒,秒值要先乘 1000;Date.getTime 返回毫秒,floor(Date.now()/1000) 返回整数秒。
机器接口应交换带 Z/Offset 的 ISO,或单位命名明确的数值字段;无 Offset 日期会产生本地时区歧义。
const ms = Date.now();
const sec = Math.floor(ms / 1000);
new Date(sec * 1000);
new Date(ms);自动判断的边界
数值大小适合粘贴当前时间。ToolGarden 把约 1e11 以下当秒、1e14 以下当毫秒、更大当微秒,并允许手动选择。
不要只看字符串长度:负号、小数、前导零和远期日期会干扰。转换前应显示解释出的单位。
精度与闰秒
JavaScript Number 只能精确表示到 2^53−1。实用毫秒值安全,当前纳秒值已不安全;需要亚毫秒精度时使用 BigInt 或字符串。
Date 只保存毫秒,微秒转换会丢失细节;Unix 时间通常也不把闰秒作为普通独立值。
排查清单
先确认单位,再检查时区和解析器。对比原始值、ISO、UTC 与本地显示。字段应命名 createdAtSeconds 或 createdAtMs。
- 1970:很可能把秒当毫秒。
- 遥远未来:可能把毫秒再次乘 1000。
- 相差小时:检查时区。
- 排序丢失:亚毫秒精度被丢弃。
- 相差一天:检查仅日期解析。
总结
Unix 时间戳只有单位明确时才简单。系统边界统一单位,JavaScript Date 使用毫秒,高精度另行保留,时区规则用于展示和日程。