Linux上的TZ环境变量
Linux默认的时区是UTC,所以在创建Docker容器时我们会添加一个环境变量TZ=Asia/Shanghai
来指定容器的时区,但是偶然发现直接指定TZ环境变量为Asia/Shanghai后date
命令输出的时间依然是UTC时间,于是去研究了一下这个环境变量。
TZ
环境变量如何使用
TZ
是POSIX标准中定义的一个标准环境变量,用来覆盖各种与时间有关的函数的默认时区。在Linux中,基本是GNU C 库
即glibc
,glibc
的TZ
环境变量有2种写法:
std offset[dst[offset][,start[/time],end[/time]]]
,如国内的时区对应为CTS-8
:[filespec]
,这是最常见的一种,如Asia/Shanghai
对于TZ
环境变量的解释为:
如果使用的filespec格式,对于
:/
开头的,会去读取指定路径的tzfile
格式的时区文件来读取时区信息;对于:
开头的会去系统时区目录读取时区文件,即/usr/share/zoneinfo/
;对于:
也没有,只有一个filespec的,比如常见的TZ=Asia/Shanghai
,会尝试上面两种TZ
环境变量的格式如果
TZ
环境变量没有被设置,则使用默认时区,默认时区TZ=:/etc/localtime
,通过将tzfile
格式的文件复制或者软连接到/etc/localtime
来配置默认时区,比如:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
如果TZ环境变量被设置了但是内容为空,或者设置了但是无法被解析,则使用UTC
不是每个镜像都打包了tzfile
时区文件
对于一些特殊的镜像,不一定会带时区文件,可以用以下命令测试
1 | docker run --rm 镜像名 ls -lah /usr/share/zoneinfo/Asia/Shanghai |
带时区文件的常见的,比如
- mysql
- redis
也有一些不带的,比如
- alpine
所以为了保证TZ
环境变量能够生效,使用CST-8
这种会好一些
https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
https://xy2401.com/local-docs/gnu/manual.zh/libc/TZ-Variable.html