問題:這幾天轉用docker部署項目,部署後發現在涉及時間判斷的總是出錯,查了資料發現是docker容器的默認時區是0時區的UTC時區
解決方案:
說明:我寫了個方法打印 java 獲取到的時間 Demo
一、未啓動的容器
在啓動容器的時候加上 -e TZ="Asia/Shanghai" 參數即可
docker run -e TZ="Asia/Shanghai" -d -p 80:80 --name nginx nginx
這個是最好的解決辦法,在容器內打印時間也是正常的
root@f33dc1b95772:/bootapps# date -R
Fri, 01 Nov 2019 17:31:51 +0800
java獲取到的時間也是正常的
root@f33dc1b95772:/bootapps# java Demo
new Date():Fri Nov 01 17:31:18 CST 2019
LocalDateTime:2019-11-01T17:31:18.771
二、已啓動的容器
已啓動的容器
1.修改docker容器時區
進入容器內,執行命令
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
或者
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
在容器中執行 date -R 命令時區正常
root@96ce5f1aa65d:/# date -R
Fri, 01 Nov 2019 17:45:07 +0800
但是在java獲取時間的時區還是 0時區的 UTC 時區
root@96ce5f1aa65d:/bootapps# java Demo
new Date():Fri Nov 01 09:46:13 UTC 2019
LocalDateTime:2019-11-01T09:46:13.388
2.修改java獲取的時區
查資料發現 jre是通過配置文件讀取本地時間的:/etc/timezone
所以把時區加進去,進入容器內執行命令
echo "Asia/Shanghai" > /etc/timezone
現在java程序獲取的時區就是 +8時區的 CST 時區
root@96ce5f1aa65d:/bootapps# java Demo
new Date():Fri Nov 01 17:49:11 CST 2019
LocalDateTime:2019-11-01T17:49:11.578
tips:此時如果你的應用是跑着的話則需要在容器內重啓應用或者直接重啓容器
附:
進入容器命令 docker exec -it 容器ID或者容器名稱 /bin/bash
docker -exec -it 1e3cd9ee8cdd /bin/bash
重啓容器命令
docker restart 1e3cd9ee8cdd