{"created_at": "2026-03-01T10:00:00+08:00"}
new Date('2026-03-01T10:00:00+08:00').toISOString()

接口返回的时间是 2026-03-01T10:00:00,没有 Z 也没有偏移量,前端用 new Date 解析后显示成 10:00 本地时间,实际应该是北京时间 18:00。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:带时区的 ISO8601 必须带 Z 或 +08:00 后缀,不带时浏览器按本地时区解释。服务端序列化时用了不带偏移的 LocalDateTime,时区信息在出口就丢了,前端补不回来。

「接口时区偏移」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:统一输出带偏移的 ISO8601 比如 2026-03-01T10:00:00+08:00;服务端内部统一存 UTC 出口再转成业务时区;前端按用户时区展示 不要直接截字符串;把时间字段的序列化配置写进全局 别在每个接口单独处理。

确认没问题再收工,同一时间在不同时区的机器上打开页面 显示的都是本地对应时刻。

作者 9823189