You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat 9环境下数据库日期字段存储时间偏移2小时问题求助

解决Tomcat部署后时间字段倒退2小时的问题

从你描述的情况来看,核心问题几乎可以确定是本地与远程Tomcat的JVM时区配置不一致导致的——嵌入式Tomcat默认继承了本地系统时区,而远程Tomcat的JVM可能默认使用UTC时区(或其他与你本地相差2小时的时区),才会出现日志时间正确(Log4j通常读取系统时区)但业务操作时间慢2小时的情况。

下面是具体的排查和解决步骤:

1. 验证远程Tomcat的JVM时区

先确认远程服务器上Tomcat使用的JVM时区是否和本地一致:

  • 在远程服务器上执行命令:
    java -XshowSettings:properties -version
    
    查看输出里的user.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:57:41