Linux环境与Windows环境部署程序显示的时间不一致

在项目上驻场研发时遇到一个问题,和Linux与Windows获取时间相关的问题。
问题发生的背景是,一套使用tomcat部署的Java web程序,研发环境在Windows上,测试环境在Linux上。两套程序代码一致,连接同一套oracle数据库。然而,在读取数据库中的数据时,访问研发环境的程序页面,显示的时间数据是正确的。但是访问测试环境的程序时,页面显示的时间是错误的,比研发环境的程序快了12小时。
当时第一反应是两个环境的操作系统时间不一致,然而发现系统时间是一致的。后来想到Linux和Windows两个系统对于时间的计算方式不同,Windows把系统硬件时间当作本地时间(local time),即操作系统中显示的时间跟BIOS中显示的时间是一样的。而Linux把硬件时间当作 UTC,操作系统中显示的时间是硬件时间经过换算得来的。后来想到,这种情况属于在同一台PC上的双系统时间不一致的问题,而且就算是不一致也应该是相差8个小时。所以问题不在这里,和同事讨论并且搜索了各种材料之后,发现导致该问题发生的原因,应该是Linux的硬件时间和系统时间不一致的问题。
介绍一下Linux的硬件时间与系统时间。
系统时间: 一般说来就是我们执行 date 命令看到的时间,Linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
通过date命令获取系统时间,在用hwclock命令获取硬件时间。结果如下:

硬件时间和系统时间正好相差12个小时。而系统时间才是正确显示的时间。想了想,自己前一天因为发现系统时间快了12个小时,于是手动进行了修改。也并没有重启服务器。这里造成了两个后果,一是导致了系统时间与硬件时间不一致,另一个结果是,因为JVM获取时间的原理导致并不能获取到正确的当前时间,因此导致了这个问题的发生。
于是使用以下命令将硬件时间与系统时间同步:
hwclock --systohc
之后重启了tomcat,问题解决了。


在网上查阅的相关资料:
http://www.360doc.com/content/15/0112/16/15242507_440173299.shtml
http://www.cnblogs.com/shiweifu/archive/2010/12/16/1907653.html
http://blog.chinaunix.net/uid-182041-id-3464524.html
http://blog.csdn.net/velanjun/article/details/8213303
发布了29 篇原创文章 · 获赞 70 · 访问量 21万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章