Tomcat7.x时区问题致使时间获取不正确

最近在开发中遇到一个很是罕见的问题,就是centos测试服务器上的时间虽然正确,可是安装在上面的Tomacat7.x的时间时区出现错误。
个人程序代码中,刚好使用了对时间查询的sql语句,例如java

select <cols> from table where sendtime <= #{nowtime} and deadlinetime >= #{nowtime}

此时执行远程单步调试,发现代码中new Date()取得的当前时间nowtime,比正确的时间晚13个小时,形成查询结果错误,难道取当前时间还会出错?因而改用
mysql

Calendar calendar = Calendar.getInstance();
Date nowDate = calendar.getTime();

仍然不能得到正确的当前时间。这是怎么回事,好长时间让我一头雾水。

在网上搜索了一下经过代码解决的方案,有些文章给出了在代码中设置时区的办法,相似下面:
web

 //更改当前时区为东八区GMT+8,即北京时间。
        TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

这样的话,经过new Date()或者calendar.getTime()能够取得当前正确时间了,可是又出现了新的问题,mysql数据库里数据的时间字段的时间发生了改变,所有自动加了13个小时!
具体就是,用客户端软件链接到mysql,执行select <cols> from table order by sendtime desc相似的语句,看到sendtime,deadlinetime等字段的值没有变化,可是远程单步调试时,查看执行上面sql语句取出的结果集列表里的时间,则所有自动日后推了13个小时,怎么会这样!前面忘记说了,时间字段都是timestamp型的字段。
看来使用代码设置时区,会对数据库的timestamp时间类型的字段产生影响。
至此,几乎束手无策,机关用尽了。

忽然,眼前灵光一闪,有了一个突破口,想起这几天观察这个Tomcat7.x的log日志文件的时间,也老是比当前正确时间晚13小时。是怎么发现这个问题的呢?在centos测试机上tail -f catalina.out文件时,发现实时打印的带时间信息的log语句,都比当前服务器时间晚13个小时。

笔者开发Java好多年,从未遇到过这种问题,之前遇到的,基本是服务器时区不正确,形成Tomcat等webserver时间跟着出错,这样至少服务器时区时间和webserver的时间仍是一致的;而此次的状况,倒是服务器时区,时间都正确,Tomcat容器的时间/时区却不正确。
至今尚不知如何形成这个错误的。由于我在本身帐号的目录下直接wget一个tomcat7.x发行版并解压安装,并未出现这个问题,说明并非tomcat7.x自身的问题。显然仍是在对tomcat7.x的某些配置作了修订以后才会引起这个问题。
这下问题明了了,先把log日志的时间改正确再说!

为了解决此问题,google了一些文章,在${catalina_home}/bin/catalina.sh文件中的JAVA_OPTS启动参数中作了如下调整,
sql

JAVA_OPTS="-server  -Duser.timezone=GMT+08 -Xms1024m -Xmx1024m"

即增长了时区选项-Duser.timezone=GMT+08,从新启动Tomcat,log日志的时间正确了。

接着,改回原始的代码,注释TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));等语句,全部的时间和sql查询都正确了。
至此,问题完全解决。

数据库

相关文章
相关标签/搜索