Unix 时间戳解释:秒、毫秒、UTC 与日志调试
Unix 时间戳解释:秒、毫秒、UTC 与日志调试
解释 Unix 时间戳、单位混淆、UTC 显示、JavaScript 毫秒,以及如何阅读日志和 API 时间字段。
原创流程图
Unix 时间戳解释:秒、毫秒、UTC 与日志调试
理解原理
检查后再进入下一步
检查边界
检查后再进入下一步
使用工具
检查后再进入下一步
Unix time 计量从 1970 年开始经过的时间,基准是 UTC。时间戳不是带时区的字符串,而是一个计数。同一个时间戳在各地代表同一瞬间,但显示成不同本地时间。
很多 API 和数据库用秒,JavaScript Date 常用毫秒。混用会让日期偏离一千倍:秒被当毫秒会接近 1970,毫秒被当秒会跑到很远未来。当前秒级时间戳通常 10 位,毫秒级通常 13 位。
调试时本地时间会制造混乱,因为每个人看到的显示可能不同。UTC 给团队共同参考。用户界面可以显示本地时间,但事故记录、日志、token claim、数据库比较和调度分析应包含 UTC 或明确时区。
JWT 的 exp、iat、nbf 通常用秒。日志平台可能同时保存事件时间、写入时间、处理时间和显示时间。Webhook 也可能区分事件发生和系统收到。比较时间时要先知道每个数字代表哪件事。
分布式系统依赖大体同步但不完美的时钟。一个服务器签发的 token 在另一个服务器看来可能稍微来自未来。小容差合理,但不能用巨大容差掩盖秒毫秒混淆或时区错误。
格式化日期可能省略秒、毫秒、时区或偏移。它更好读,但调试能力更弱。如果两个事件看似同一分钟发生,毫秒精度可能仍能说明顺序。无时区日期字符串也可能被另一个系统按本地时间解释。
时间看起来不对时,先判断单位是秒、毫秒、微秒还是纳秒;转成 UTC;再转相关本地时区;确认该时间代表哪个事件;用同一单位和相邻事件比较;最后把预期单位写进 API 文档、数据库注释或类型名。
常见问题
秒级时间戳可能被当成毫秒,或这个值其实是持续时间而非绝对时间。
两者都可以,关键是命名和文档一致。
不包含。它表示一个瞬间,时区只影响显示。
分开比较事件时间、写入时间、处理时间和显示时间。
created_at_ms 或 expires_at_seconds 这类命名能防止跨语言边界时猜错单位。
用一个已知秒值、一个已知毫秒值和一个靠近时区边界的日期,分别转 UTC 和本地时间。