这类问题我又碰上了一次。一台跑在境外的 CentOS 7.9 机器,夏令时切换当天有两个定时任务各跑了两遍,日志时间戳前后差一小时,zdump 看到的规则还是几年前的。
第一反应是「cron 按本地时间触发,时间跳变时同一条任务被匹配两次」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。系统里的 tzdata 版本太老,当年的夏令时规则还没收录;应用用的是 JVM 自带的时区库,和系统 tzdata 不是同一份;容器的时区文件是构建时拷进去的,之后没更新过。
上来先确认时区数据的版本和规则
rpm -q tzdata && zdump -v Asia/Shanghai | tail -4
升级系统时区数据
yum update -y tzdata
同步刷新应用侧的时区库
java -XshowSettings:properties -version 2>&1 | grep -i timezone
剩下的就是把关键任务改成 UTC 触发并验证
timedatectl && crontab -l | head
怎么算真的好了,看的是同一批现象。zdump 输出的规则与当年夏令时一致,任务在切换日只执行一次,日志时间戳连续没有回跳。
这里还有个坑。时区数据要跟系统和运行时一起升级,只升一边会出现差一小时;关键任务用 UTC 触发能彻底避开夏令时的坑。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
