关于docker容器时区问题,已运行和未运行的时区修改和java运行获取的时区修改

mac2025-10-16  6

问题:这几天转用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

 

最新回复(0)