前阵子帮人排查一个"幽灵"定时任务,配置写得明明白白凌晨三点跑,结果总是在大中午触发,日志时间戳还跟监控系统对不上,差了整整八个小时。最后定位到开发机是 UTC+8,部署的服务器却是 UTC+0,两边对"今天"的定义根本不在一条线上。
这类 bug 最烦的地方在于:测试几乎都在工作时段跑,依赖"当前小时"的那段逻辑平时安安稳稳,一旦跨时区部署、或者踩到时区边界的临界点,才突然露馅。白天怎么测都绿,半夜被报警叫醒才发现全错位——像极了没调闹钟的出差,表面一切正常,落地才知道时差。
其实我现在给自己定了个死规矩:内部存储和运算一律走 UTC,只有到了显示层才换算成本地时间;时间来源做成可注入的依赖,测试时塞个假的 clock 进去,把边界情况挨个打一遍。这样至少不用真等到半夜才发现问题。
严格来说
至于夏令时(DST)那个更阴间的东西……那又是另外一个坑了,回头单独开帖吐槽。