我在部署應用到centos系統上的tomcat服務器中運行,發現操作系統的時間和tomcat中的訪問日志的時間與系統時間不一致,但是查看當前操作系統的時區也是CST時區(中國標准時區)。
查看系統的時區:
root@localhost:~# date +"%Z %z"
CST +0800
如果系統時間不對,centos執行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改時區
解決方法一:
修改catalina.sh文件
查找catalina.sh文件路徑: find / -name "catalina.sh"
在文件的開頭添加如下內容:
export JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/shanghai",重啟tomcat
但是,有的時候通過方法一還是解決不了java程序時區問題,java程序讀取時間還是不對,甚至System.getProperty("user.timezone")都讀不到時區信息。主要原因是我們在安裝JDK之后發現時間不對才去修改的系統時區,此時jdk已經默認使用系統修改之前的那個時區,已經改不回來了,刪掉jdk重裝也沒用。
java -XshowSettings 展示java配置

解決方法二:
就是修改/etc/profile文件,在文件的末尾添加 export TZ='Asia/Shanghai',然后使用命令source /etc/profile使其生效即可。
總結:
java程序在初始化時區的時候,如果沒有指定JVM參數-Duser.timezone=GMT+08,java程序就會默認讀取操作系統的時區來初始化java程序的時區。
為了保證java程序在啟動時加載正確的默認時區:
1、需要將系統的時區改正確
2、還需要將硬件時鍾的系統時鍾校准(執行命令hwclock --systohc --localtime)
3、修改配置文件中的時區參數
4、在/etc/profile文件末尾添加:export TZ='Asia/Shanghai
5、修改tomcat安裝目錄下的bin目錄下的catalina.sh腳本,添加JVM參數JAVA_OPTS="${JAVA_OPTS} -Duser.timezone=GMT+08",來保證Tomcat的時區是東八區時區
