昨天帮人查了个诡异 bug,日期在数据库里凭空少了一天。根子特别阴:new Date(‘2024-01-01’) 这种写法,JS 引擎会把它当成 UTC 零点去解析,可你在中国时区,渲染出来的本地时间就变成了 2023-12-31 晚上 8 点。用户明明选了一月一号,落库之后变成了头一年的最后一天,第二天报表全对不上。
这个坑最恶心的地方在于它平时不炸。本地开发、单机部署,时区一致的时候一切正常,你根本发现不了。等哪天服务迁到跨时区的机房,或者碰到夏令时切换,所有日期 silently 整体错位,而且错得毫无规律,查起来想死。
简单说我的经验是,日期字符串永远别裸写。要么老老实实带上 Z 的 ISO 8601 格式,让时区信息显式写进串里;要么上 dayjs 的 utc 模式,存之前先 lock 住时区再转。一句话,时区这东西你不能指望运行时替你猜,得自己钉死。别等上线了才发现用户生日集体提前了一天。