在docker容器中運行的java應用打出的日志時間和通過date -R方式獲取的容器標准時間有八個小時時間差~
因為docker容器的原生時區為0時區,為了和國內時區保持一致,需要把容器時區調為東八區,方法非常簡單,在/usr/share/zoneinfo目錄下面有大量的時區文件,涵蓋各個時區,根據自己的需求直接把對應的文件拷貝到/etc目錄下,重命名為localtime文件即可。
隨后發現一個問題,雖然docker容器的時區已經修改為東八區了,但是容器中的java應用打出的log日志時間仍然和上海時間有很大的時間差,因此,寫了一段代碼來測試
import java.sql.Timestamp; import java.util.TimeZone; public class test { public static void main(String [] args){ TimeZone tz = TimeZone.getDefault(); System.out.println("tz: " + tz); Timestamp curTime = new Timestamp(System.currentTimeMillis()); System.out.println("時間: " + curTime); } }
發現結果為:
結果顯示java程序輸出的是洛杉磯時區的時間,說明java並沒有直接從docker容器中獲取時間。這種情況有兩種解決方案:
一 、使用TZ環境變量,然后再運行Java程序
export TZ=Asia/Shanghai(寫到/etc/profile文件中然后重啟系統生效)
再運行java測試程序,結果變為
二、使用 -Duser.timezone=GMT+08 作為Java虛擬機的系統參數