日期选择器选 3 月 1 日,前端 toISOString 后是 2026-02-28T16:00:00.000Z。后端按 UTC 截日期存成 2 月 28 日,列表里生日全部早一天。日志里能对上时间点,这种反而好排。

不带时区的日期时间串按本地时间解析,转成 ISO 就一定落到 UTC,东八区的零点对应前一天 16 点。后端再用 substring 或者 UTC 取日期,拿到的就是前一天。这一点先确认清楚,后面就不用反复试。

node -e "console.log(new Date('2026-03-01T00:00:00').toISOString())"
node -e "console.log(new Date(2026,2,1).toLocaleDateString('sv-SE'))"

「date-only 解析」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:纯日期用 YYYY-MM-DD 字符串直传 不要经过 Date;后端用 LocalDate 接 不要用 Date 或 Instant;前端必须转时用本地年月日手动拼串;跨时区用户按业务时区解释 接口文档写清。

结果对不对很好判断,提交 3 月 1 日 后端存的是 2026-03-01 列表显示不再提前一天。

作者 9823189