在 CentOS 上发现 Java 程序日志时间不对(比如慢 8 小时、快几小时、或时区不对),通常不是 Java 本身的问题,而是系统时间 / 时区 / JVM 时区配置不一致导致的。下面按常见原因逐条说明。
Java 默认会读取操作系统时区。
查看系统时区:
timedatectl
或
date
如果是 UTC 而不是 Asia/Shanghai,Java 日志就会慢 8 小时。
修改为东八区:
timedatectl set-timezone Asia/Shanghai
或(老版本):
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
即使系统是对的,Java 也可能被强制指定了 UTC。
检查 Java 使用的时间:
java -XshowSettings:properties -version 2>&1 | grep timezone
或代码中:
System.out.println(TimeZone.getDefault());
解决方法:
java -Duser.timezone=Asia/Shanghai -jar app.jar
ENV TZ=Asia/Shanghai
<pattern>%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}</pattern>
或全局:
<contextName>app</contextName>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}{Asia/Shanghai}"/>
spring:
jackson:
time-zone: Asia/Shanghai
容器默认时区通常是 UTC。
验证:
docker exec -it 容器Id date
解决:
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
timedatectl status | grep "NTP synchronized"
同步时间:
ntpdate cn.pool.ntp.org
# 或
chronyc -a makestep
timestamp:受数据库时区影响datetime:原样存储serverTimezone=Asia/Shanghai
date 显示正确时区user.timezone 正确TZ如果你愿意,可以告诉我:
我可以直接给你对应配置文件修改示例。