最近在开发中遇到一个非常罕见的问题,就是centos测试服务器上的时间虽然正确,但是安装在上面的Tomacat7.x的时间时区出现错误。
我的程序代码中,恰好使用了对时间查询的sql语句,例如
select <cols> from table where sendtime <= #{nowtime} and deadlinetime >= #{nowtime}
此时执行远程单步调试,发现代码中new Date()取得的当前时间nowtime,比正确的时间晚13个小时,造成查询结果错误,难道取当前时间还会出错?于是改用
Calendar calendar = Calendar.getInstance();
Date nowDate = calendar.getTime();
仍然不能获得正确的当前时间。这是怎么回事,好长时间让我一头雾水。
在网上搜索了一下通过代码解决的方案,有些文章给出了在代码中设置时区的办法,类似下面:
//更改当前时区为东八区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启动参数中做了以下调整:
JAVA_OPTS="-server -Duser.timezone=GMT+08 -Xms1024m -Xmx1024m"
即增加了时区选项-Duser.timezone=GMT+08,重新启动Tomcat,log日志的时间正确了。
接着,改回原始的代码,注释TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));等语句,所有的时间和sql查询都正确了。
至此,问题彻底解决。
分享到:
相关推荐
Tomcat7.x 64位系统
tomcat5.0.x与tomcat5.5.x的配置有较大区别在</context></host>之间加入下列代码:
hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+...
Tomcat-7.x-32 Tomcat 7.x Tomcat7 32位 系统
apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...
comet4j消息推送所需的comet4j-tomcat7.jar包,comet4j-tomcat7.jar
Apache Tomcat 5.0.x 对于Servlet和JSP的支持是一样的。大量底层代码里的重大修改,带来性能的提升、稳定性的提升及整体成本。 Apache Tomcat 5.0.x在Apache Tomcat 4.1的基础上做了很多改动,包括: · 性能优化和...
tomcat 7.077,7.077版本很不错的工具,最学习cxf-spring是很不错的选择,又很多工具都是你能够用上的
tomcat7.0下的64位的tomcat7.exe 和tomcat7w.exe 解决“%1不是有效的win32应用程序”问题
Tomcat6.0windows安装程序 含有源代码
tomcat 6.X 连接池的配置
服务器主动向客户端推送消息所需的comet4j-tomcat7.jar和comen4j.js,在此需注意:comet4j-tomcat7.jar目前仅支持tomcat6和tomcat7
tomcat官网7最后版本
tomcat java 服务器 官方网站下载,安全放心使用,windows版本。解压后安装。
tomcat7.0安装版,它不需要在安装之后进行环境变量配置。
tomcat6.x源码 Eclipse导入的时候选new project-->Java Project From Existing Ant Buildfile 最后在你的workspace下面只有一个build.xml被导过去 前提是你的build.xml要正确包含需要的全部东西,比如你要用到的...
tomcat service.bat配置tomcat成服务。
tomcat 7.052版本 tomcat 7.052版本 tomcat 7.052版本 tomcat 7.052版本 tomcat 7.052版本 tomcat 7.052版本
tomcat 7 最新版本 apache-tomcat-7.0.109
最新版windows apache-tomcat-10.0.27-windows-x64.zip最新版windows apache-tomcat-10.0.27-windows-x64.zip