问题:这几天转用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 +0800java获取到的时间也是正常的
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.3882.修改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.578tips:此时如果你的应用是跑着的话则需要在容器内重启应用或者直接重启容器
附:
进入容器命令 docker exec -it 容器ID或者容器名称 /bin/bash
docker -exec -it 1e3cd9ee8cdd /bin/bash重启容器命令
docker restart 1e3cd9ee8cdd
