前两天被一个时间 bug 折磨了整整一个下午。一行看着人畜无害的代码 new Date(“2023-03-08”),本地跑出来是当天零点,逻辑一切正常。结果上了生产,日期整体往前挪了 8 小时,定时任务算出来的"今天"变成了"昨天",下游对账直接错乱。
后来才搞明白,ES5 之后 JS 对没带时区信息的日期字符串是按 UTC 零点解析的,而我们的日志和数据库默认走的是东八区本地时间。两边对不上,凭空差出 8 小时。更坑的是这问题在本地和测试环境根本复现不了,因为只有生产机的时区环境和解析器的假设对不上,属于"偶尔抽风"的类型,排查起来极其痛苦。
根治其实不难,就是别让解析器替你猜时区。要么全程用 Unix 时间戳,要么老老实实传带 Z 的 ISO8601,比如 2023-03-08T00:00:00Z。解析时显式声明时区,比事后对着错乱数据拍脑袋强太多。
这坑估计不少人都踩过,发出来给后来者提个醒。你们还遇到过什么时间相关的阴间 bug?