在海外跑客户十年,以为搞懂了UTC就万事大吉。去年系统切到美东时间,直接把"2023-11-05 01:30"存进DB,结果夏令时回拨导致订单时间戳重复,客户以为我们系统挂了。
这就像debug时只看了变量值没看内存地址。时区是地理概念,偏移量是政治概念。
坑点:
- America/New_York ≠ UTC-5,它是UTC-4/EST或UTC-5/EDT的动态集合
- 不要用offset存储,要存IANA时区名
- 历史时区会变(俄罗斯取消夏令时,萨摩亚跳过12/30)
解决方案:
- 存储:永远是UTC + 原始时区名
- 显示:前端根据用户locale转换
- 计算:用moment-timezone或date-fns-tz,别手写偏移
literally,时间处理是分布式系统里最脏的状态管理。