`
sharong
  • 浏览: 493383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8720
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13059
社区版块
存档分类
最新评论

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

阅读更多
最近在开发中遇到一个非常罕见的问题,就是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查询都正确了。
至此,问题彻底解决。
1
0
分享到:
评论
2 楼 sharong 2014-12-01  
Megaray 写道
JVM还有这么个参数?
-Duser.timezone=GMT+08
????

速查官网
1 楼 Megaray 2014-12-01  
JVM还有这么个参数?
-Duser.timezone=GMT+08
????

相关推荐

    Tomcat7.x 64位系统

    【标题】:“Tomcat7.x 64位系统”指的是Apache Tomcat服务器的第七个主要版本,专为64位操作系统设计。Tomcat是开源软件,遵循Apache Software Foundation的许可,是Java Servlet、JavaServer Pages(JSP)和Java ...

    tomcat7.0下的64位的tomcat7.exe 和tomcat7w.exe

    标题中的“tomcat7.0下的64位的tomcat7.exe 和tomcat7w.exe”指的是Apache Tomcat服务器在7.0版本中为64位操作系统提供的可执行文件。Tomcat是Apache软件基金会的一个开源项目,它是一个流行的Java Servlet容器,...

    集群 Tomcat 6.x 和 Tomcat 7.x,使用 redis 存储会话.zip

    集群 Tomcat 6.x 和 Tomcat 7.x,使用 redis 存储会话实现RedisManager继承org.apache.catalina.session.StandardManager,RedisSession继承org.apache.catalina.session.StandardSession。安装步骤:1. 复制:wjw-...

    tomcat5.0.x与tomcat5.5.x的配置有较大区别

    标题中的“tomcat5.0.x与tomcat5.5.x的配置有较大区别”指的是在升级或迁移Tomcat版本时,配置文件的差异可能导致应用无法正常运行。这两个版本之间的主要区别在于`server.xml`配置文件中对Web应用程序的设置方式,...

    Tomcat6.x

    9. **版本兼容性**:Tomcat6.x对应的是Java EE 5规范,因此与Java SE 5或6兼容,但不支持更高级别的Java特性。 10. **安全性**:支持SSL/TLS协议,可以实现安全的HTTPS通信,同时有多种安全机制如角色基础的访问...

    Tomcat6.0.x 包

    【标题】: "Tomcat6.0.x 包" 【描述】: "Tomcat6.0windows安装程序 含有源代码" 这个压缩包文件包含了Apache ...总之,Tomcat 6.0.x是Java Web开发中一个不可或缺的工具,它的源代码也为我们提供了宝贵的教育资源。

    windows安装版-tomcat8.5.57.zip

    1. **版本特性**:Tomcat 8.5.x系列是基于Java EE 7标准的,相比于之前的版本,它增加了对WebSocket、JSON-P、JAX-RS 2.0等新特性的支持。 2. **配置**:在Windows环境下,可以通过修改“conf/server.xml”文件来...

    myeclipse中Tomcat的配置(7.X)的环境【步骤图解】

    本文将详细介绍如何在MyEclipse中配置Tomcat 7.x的环境,帮助开发者创建、运行和调试基于Java Servlet和JavaServer Pages(JSP)的应用。 首先,你需要确保已经安装了MyEclipse和Tomcat 7.x。如果你尚未安装,可以...

    tomcat7.0.109下载

    Tomcat 7.0.109作为7.x系列的最后一个版本,意味着在发布后,官方将不再为这个分支提供新功能更新或安全补丁。这通常是开发者为了保持稳定性和兼容性而选择的版本,因为较旧版本的软件在已知问题上已经被充分测试和...

    apache-tomcat-9.0.45-windows-x64

    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-...

    tomcat6.0.X安装Admin

    - **Admin 模块包**:由于 Tomcat 6.0.X 默认不包含 Admin 模块,我们需要从其他来源获取相应的 Admin 模块包。通常情况下,可以使用 Tomcat 5.5.27 版本中的 Admin 模块来适配 Tomcat 6.0.X。 - **依赖库**:Admin ...

    apache-tomcat-8.5.78-windows-x64安装包-kaic.rar

    apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 ...

    tomcat9.0.85可用版本压缩包

    Apache Tomcat 9.0.85 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。这个版本是针对Java开发者的,用于部署和运行基于Java技术的Web应用。下面将...

    tomcat8.5.59

    在本文中,我们将详细探讨Tomcat 8.5.59版本,这是Tomcat 8.x系列的一个稳定版本,具有诸多改进和增强,旨在提供更高效、更安全的服务。 一、Tomcat 8.5的核心特性 1. Java EE 8支持:Tomcat 8.5系列全面支持Java ...

    tomcat 8.5.100

    - **Java EE 7支持**:Tomcat 8.5系列支持Java Enterprise Edition (Java EE) 7的部分规范,包括Servlet 3.1、JSP 2.3和EL 3.0。 - **NIO.2**:8.5版引入了对Java NIO.2 API的支持,提供了更好的性能和并发能力。 ...

    tomcat-8.5.51-x64.zip

    请注意,依赖内部实现类可能会导致与其他Tomcat版本的兼容性问题,并且在未来的版本中可能不再可用,因此这是一种权宜之计。 Apache Tomcat 8.5.51的这个变化提醒我们,保持软件更新的重要性,特别是在遵循行业标准...

    comet4j-tomcat7.jar

    comet4j消息推送所需的comet4j-tomcat7.jar包,comet4j-tomcat7.jar

    apache-tomcat-5.5.x.rar

    Tomcat 5.5.x系列是Tomcat发展历史上的一个重要版本,提供了许多增强功能和性能优化。 在Java Web开发中,Servlet是一种用于扩展服务器功能的Java类,而JSP则是基于HTML的页面,其中可以嵌入Java代码,用于创建动态...

    Tomcat5.0.x

    Apache Tomcat 5.0.x 对于Servlet和JSP的支持是一样的。大量底层代码里的重大修改,带来性能的提升、稳定性的提升及整体成本。 Apache Tomcat 5.0.x在Apache Tomcat 4.1的基础上做了很多改动,包括: · 性能优化和...

    apache-tomcat-8.5.53.zip

    Apache Tomcat 8.5.x系列是8.x主版本的一个稳定分支,它在性能、安全性以及功能上都有所提升。 首先,我们来深入了解下Apache Tomcat的主要组成部分: 1. **bin目录**:包含了启动和停止Tomcat的脚本,如`catalina...

Global site tag (gtag.js) - Google Analytics