本地跑 LocalDate.now() 拿到 2026-11-11,同一个用例在 GitHub Actions 上拿到 11-10,日期断言直接红。日志里 TZ 那一行是空的。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

env:
  TZ: Asia/Shanghai
# 或启动时指定
java -Duser.timezone=Asia/Shanghai -jar app.jar

Runner 默认按 UTC 走,容器没有设 TZ,JVM 取到的系统时区就是 UTC。北京时间早上八点之前,UTC 还停在前一天,日期自然差一位。这一点先确认清楚,后面就不用反复试。

「CI 容器时区」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,在 workflow 的 env 里显式设 TZ=Asia/Shanghai;JVM 启动参数加 -Duser.timezone 兜底;断言不直接取 now 用注入的 Clock;改完在 CI 日志里打一行 date 核对偏移。

改完照着核一遍,CI 日志里的 date 带 +0800 日期断言和本地一致。

作者 9823189