Pod 里 TZ 设了 Asia/Shanghai,Java 应用日志时间还是 UTC,和宿主机差 8 小时。日志里能对上时间点,这种反而好排。

TZ 只影响 libc 的本地时间,JVM 启动时读的是 user.timezone,容器里没有 tzdata 时还会退回 UTC。环境变量不会自动改 JVM 的默认时区。这一点先确认清楚,后面就不用反复试。

kubectl exec api-7b8c9d6f5-3kz8m -- date
kubectl exec api-7b8c9d6f5-3kz8m -- java -XshowSettings:properties -version 2>&1 | grep user.timezone

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

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

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:在启动参数里加 -Duser.timezone=Asia/Shanghai;镜像里装 tzdata 确认 /usr/share/zoneinfo/Asia/Shanghai 存在;日志框架的 pattern 里显式写时区 别依赖默认值;用一个打印 LocalDateTime.now 的接口验证。

结果对不对很好判断,接口返回的时间带 +08:00 容器内 date 和宿主机一致。

作者 9823189