Tomcat 9环境下数据库日期字段存储时间偏移2小时问题求助
解决Tomcat部署后时间字段倒退2小时的问题
从你描述的情况来看,核心问题几乎可以确定是本地与远程Tomcat的JVM时区配置不一致导致的——嵌入式Tomcat默认继承了本地系统时区,而远程Tomcat的JVM可能默认使用UTC时区(或其他与你本地相差2小时的时区),才会出现日志时间正确(Log4j通常读取系统时区)但业务操作时间慢2小时的情况。
下面是具体的排查和解决步骤:
1. 验证远程Tomcat的JVM时区
先确认远程服务器上Tomcat使用的JVM时区是否和本地一致:
- 在远程服务器上执行命令:
查看输出里的java -XshowSettings:properties -versionuser.timezone属性,对比本地机器的同属性值,如果两者不同,就是问题根源。
2. 修改远程Tomcat的JVM时区参数
找到远程Tomcat安装目录下的bin文件夹,根据操作系统修改对应的启动脚本:
Windows系统(catalina.bat)
打开catalina.bat,找到set JAVA_OPTS=的配置行,添加时区参数:
set JAVA_OPTS=%JAVA_OPTS% -Duser.timezone=你的时区ID
比如你所在时区是中欧时间(GMT+2),就填Europe/Paris;如果是北京时间,填Asia/Shanghai。
Linux系统(catalina.sh)
打开catalina.sh,添加以下配置到脚本开头附近:
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=你的时区ID"
3. 额外排查点(可选)
如果修改JVM时区后问题仍存在,可以检查:
- 数据库连接配置:JDBC URL中是否指定了
serverTimezone参数?比如jdbc:mysql://xxx:3306/db?serverTimezone=UTC,如果这里的时区和JVM时区不一致,也可能导致时间偏差。 - 应用代码时间处理:确认代码中是否显式使用了UTC时区(比如
Instant.now())但未转换为本地时区,或者没有指定时区直接使用new Date()(依赖JVM时区)。
结合你提供的日志:
2021-09-29 10:25:04,391 INFO ? [https-openssl-nio-8444-exec-8] ... accessed resource /app/contracts/249 @ 29/09/2021 at 08:25:04 LOG ENTRY: 10:25 OPERATION: 08:25
日志时间(10:25)是Log4j读取的系统时区时间,而操作时间(08:25)是应用从JVM时区获取的时间,两者差2小时完全符合JVM时区与系统时区不一致的特征,修改JVM时区参数应该就能解决问题。
内容的提问来源于stack exchange,提问作者cheroz
相关产品推荐
相关产品推荐

