? ? ? 我在部署應(yīng)用到Ubantu系統(tǒng)上的tomcat服務(wù)器中運行,發(fā)現(xiàn)操作系統(tǒng)的時間和tomcat中的應(yīng)用程序獲取的時間不一致癞揉,總是相差8個小時歪今,但是查看當(dāng)前操作系統(tǒng)的時區(qū)也是CST時區(qū)(中國標(biāo)準(zhǔn)時區(qū))。
查看系統(tǒng)的時區(qū):
root@localhost:~# date +"%Z %z"
CST +0800
? ? ? 說明時區(qū)沒有問題珊随,是東八區(qū)時區(qū),但是為什么tomcat啟動的時候沒有使用我設(shè)置好的時區(qū)呢柿隙?最后我通過java代碼直接獲取默認(rèn)時區(qū)叶洞,發(fā)現(xiàn)輸出的的是:Etc/UTC,怪不得時間差8小時禀崖,如下圖:
Java代碼獲取系統(tǒng)默認(rèn)時區(qū):
System.out.println(newDate());
System.out.println(System.getProperty("user.timezone"));
? ? ? 在啟動java程序的時候添加上-Duser.timezone=Asia/Shanghai參數(shù)衩辟,時區(qū)變對了,其原因是java程序在啟動的時候如果沒有指定時區(qū)波附,默認(rèn)會根據(jù)System.getProperty("user.timezone")去獲取時區(qū)操作系統(tǒng)配置文件中配置的時區(qū)艺晴。
Ubantu操作系統(tǒng)時區(qū)配置文件是/etc/timezone昼钻,將文件中的內(nèi)容修改成Asia/Shanghai,保證java程序在啟動的時候初始化時區(qū)是東八區(qū)封寞。
Centos6.X操作系統(tǒng)的時區(qū)配置文件是/etc/sysconfig/clock然评,將文件內(nèi)容修改為ZONE="Asia/Shanghai",來修正時區(qū)為東八區(qū)狈究,保證java程序在啟動的時候初始化時區(qū)是東八區(qū)碗淌。
修改Linux系統(tǒng)時區(qū),以Ubantu和centos6.x為例:
執(zhí)行:
cp /usr/share/zoneinfo/Asia/Shanghai? /etc/localtime
修改/etc/default/rcS中的UTC=yes改為UTC=no (Centos.x不用做這個操作)
時間同步:ntpdate time.windows.com
硬件時間和系統(tǒng)時間校準(zhǔn):
sudo hwclock --systohc --localtime
時區(qū)修改成功谦炒,但是記得修改時區(qū)默認(rèn)配置文件/etc/timezone中的內(nèi)容為Asia/Shanghai(Centos6.x修改的是/etc/sysconfig/clock文件中的內(nèi)容為ZONE="Asia/Shanghai")贯莺。
檢查時間是否一致,右下圖可知系統(tǒng)時間和硬件時間已經(jīng)保持一致了:
注:在配置時區(qū)的時候宁改,注意一定要校準(zhǔn)系統(tǒng)時間和硬件時間缕探,讓兩個時間保持一致。
? ? ? 但是还蹲,有的時候通過以上步驟還是解決不了java程序時區(qū)問題爹耗,java程序讀取時間還是不對,甚至System.getProperty("user.timezone")都讀不到時區(qū)信息,只有System.out.println(java.util.TimeZone.getDefault().getID())可以讀到谜喊,并且讀到的是系統(tǒng)在修改時區(qū)的時區(qū)信息潭兽。主要原因是我們在安裝JDK之后發(fā)現(xiàn)時間不對才去修改的系統(tǒng)時區(qū),此時jdk已經(jīng)默認(rèn)使用系統(tǒng)修改之前的那個時區(qū)斗遏,已經(jīng)改不回來了山卦,刪掉jdk重裝也沒用。
有兩種方法解決這個問題:
1诵次、使用-Duser.timezone=GMT+08來指定時區(qū)账蓉;
2、就是修改/etc/profile文件逾一,在文件的末尾添加 export TZ='Asia/Shanghai'铸本,然后使用命令source /etc/profile使其生效即可。
總結(jié):
java程序在初始化時區(qū)的時候遵堵,如果沒有指定JVM參數(shù)-Duser.timezone=GMT+08,java程序就會默認(rèn)讀取操作系統(tǒng)的時區(qū)來初始化java程序的時區(qū)箱玷。
為了保證java程序在啟動時加載正確的默認(rèn)時區(qū):
1、需要將系統(tǒng)的時區(qū)改正確
2陌宿、還需要將硬件時鐘的系統(tǒng)時鐘校準(zhǔn)
3锡足、修改配置文件中的時區(qū)參數(shù)
4、在/etc/profile文件末尾添加:export TZ='Asia/Shanghai
5壳坪、修改tomcat安裝目錄下的bin目錄下的catalina.sh腳本舱污,添加JVM參數(shù)JAVA_OPTS="${JAVA_OPTS} -Duser.timezone=GMT+08",來保證Tomcat的時區(qū)是東八區(qū)時區(qū)