我在部署应用到Ubantu系统上的tomcat服务器中运行,发现操做系统的时间和tomcat中的应用程序获取的时间不一致,老是相差8个小时,可是查看当前操做系统的时区也是CST时区(中国标准时区)。java
查看系统的时区:windows
root@localhost:~# date +"%Z %z"centos
CST +0800tomcat
说明时区没有问题,是东八区时区,可是为何tomcat启动的时候没有使用我设置好的时区呢?最后我经过java代码直接获取默认时区,发现输出的的是:Etc/UTC,怪不得时间差8小时,以下图:服务器
获取系统默认时区操作系统
Java代码获取系统默认时区:.net
System.out.println(newDate());部署
System.out.println(System.getProperty("user.timezone"));get
在启动java程序的时候添加上-Duser.timezone=Asia/Shanghai参数,时区变对了,其缘由是java程序在启动的时候若是没有指定时区,默认会根据System.getProperty("user.timezone")去获取时区操做系统配置文件中配置的时区。同步
Ubantu操做系统时区配置文件是/etc/timezone,将文件中的内容修改为Asia/Shanghai,保证java程序在启动的时候初始化时区是东八区。
Centos6.X操做系统的时区配置文件是/etc/sysconfig/clock,将文件内容修改成ZONE="Asia/Shanghai",来修正时区为东八区,保证java程序在启动的时候初始化时区是东八区。
修改Linux系统时区,以Ubantu和centos6.x为例:
修改Ubantu系统时区
时区修改为功
执行:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改/etc/default/rcS中的UTC=yes改成UTC=no (Centos.x不用作这个操做)
时间同步:ntpdate time.windows.com
硬件时间和系统时间校准:
sudo hwclock --systohc --localtime
时区修改为功,可是记得修改时区默认配置文件/etc/timezone中的内容为Asia/Shanghai(Centos6.x修改的是/etc/sysconfig/clock文件中的内容为ZONE="Asia/Shanghai")。
检查时间是否一致,右下图可知系统时间和硬件时间已经保持一致了:
检查时间是否一致
注:在配置时区的时候,注意必定要校准系统时间和硬件时间,让两个时间保持一致。
可是,有的时候经过以上步骤仍是解决不了java程序时区问题,java程序读取时间仍是不对,甚至System.getProperty("user.timezone")都读不到时区信息,只有System.out.println(java.util.TimeZone.getDefault().getID())能够读到,而且读到的是系统在修改时区的时区信息。主要缘由是咱们在安装JDK以后发现时间不对才去修改的系统时区,此时jdk已经默认使用系统修改以前的那个时区,已经改不回来了,删掉jdk重装也没用。
有两种方法解决这个问题:
一、使用-Duser.timezone=GMT+08来指定时区;
二、就是修改/etc/profile文件,在文件的末尾添加 export TZ='Asia/Shanghai',而后使用命令source /etc/profile使其生效便可。
总结:
java程序在初始化时区的时候,若是没有指定JVM参数-Duser.timezone=GMT+08,java程序就会默认读取操做系统的时区来初始化java程序的时区。
为了保证java程序在启动时加载正确的默认时区:
一、须要将系统的时区改正确
二、还须要将硬件时钟的系统时钟校准
三、修改配置文件中的时区参数
四、在/etc/profile文件末尾添加:export TZ='Asia/Shanghai
五、修改tomcat安装目录下的bin目录下的catalina.sh脚本,添加JVM参数JAVA_OPTS="${JAVA_OPTS} -Duser.timezone=GMT+08",来保证Tomcat的时区是东八区时区
做者:cooze 连接:https://www.jianshu.com/p/5b16cb016442 来源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。