天天看點

springboot項目在容器中啟動日志時間和系統時間不一緻

問題描述如标題。

解決過程如下:

就算在容器裡面使用: date -R 檢視時間時區也是東八區正常的。

springboot項目在容器中啟動日志時間和系統時間不一緻

 但是對于JVM所使用的時區來說它卻不認這個時區的。JVM所使用的時區有一個順序的加載。

鏡像的作業系統是:

springboot項目在容器中啟動日志時間和系統時間不一緻
JVM讀取時區檔案順序依次為:​

​$TZ​

​ > ​

​/etc/timezone​

​/etc/localtime​

​預設GMT​

​ ,跟檔案​

​/etc/sysconfig/clock​

​ 無關。

在這裡用的容器裡面是沒有  $TZ系統變量的。

springboot項目在容器中啟動日志時間和系統時間不一緻
 然後看下 cd /etc看下有沒有  ​

​/etc/timezone​

​ 
springboot項目在容器中啟動日志時間和系統時間不一緻

 發現也是沒有的。

最後看下/etc下面有沒有​

​localtime​

​   發現有而且指向UTC時區,這就是為什麼時間對不上的原因。
springboot項目在容器中啟動日志時間和系統時間不一緻

解決辦法:啟動腳本裡加上:

 -Duser.timezone=Asia/Shanghai -Dfile.encoding=utf8  多加的編碼是好習慣的問題。

預設GMT說明:java.util.TimeZone類中getDefault方法的源代碼顯示,它最終是會調用sun.util.calendar.ZoneInfo類的getTimeZone 方法。這個方法為需要的時間區域傳回一個作為ID的String參數。這個預設的時間區域ID是從 user.timezone (system)屬性那裡得到。如果user.timezone沒有定義,它就會嘗試從user.country和java.home (System)屬性來得到ID。 如果它沒有成功找到一個時間區域ID,它就會使用一個"fallback" 的GMT值。換句話說, 如果它沒有計算出你的時間區域ID,它将使用GMT作為你預設的時間區域。