第 5 课
常见时间戳陷阱
Y2038、小数秒、单位混淆与歧义日期字符串。
时间格式看似简单,却总在固定模式上翻车。认出模式能省大量排查时间。
Y2038 与整数上限
传统 32 位有符号 time_t 约在 2038-01-19 溢出。老旧嵌入式或二进制仍可能用 32 位秒。现代 64 位服务端存储多半安全,但导出 CSV 或旧客户端未必。
JavaScript Date 用毫秒双精度——范围极大,但 超大整数 传入解析器仍可能失败。
差 1000 倍(秒 vs 毫秒)
现象:
- 日期靠近 1970-01-01 → 把秒当成了毫秒(数值过小)
- 日期在 50000 年 附近 → 把毫秒当成了秒
先问:「文档说这条字段是 sec 还是 ms?」
歧义本地字符串
无 timezone 的 2024-06-01 00:30 在东京与多伦多不是同一瞬间。按「服务器本地」「用户本地」还是 UTC 解析,bug 表现完全不同。
夏令时空洞与重复
DST 切换日,本地墙钟可能跳过或重复。在「回拨」日安排「本地 2:30 AM」可能无效或歧义。闹钟、计费应用应存 UTC 瞬间。
locale 日期陷阱
03/04/2024 在美国是 3 月 4 日,在欧洲可能是 4 月 3 日。机器可读字段优先 ISO 2024-03-04。
要点
多数时间戳 bug 来自 单位混淆、缺少时区 或 遗留位宽限制——不是高深的数学。先查这三项。