使用C库的接口获取localtime相关的时间时,需要指定时区,在POSIX系统里,用户通过TZ环境变量的方式指定时区。
通常不需要设置TZ,因为系统通常已经配置好了。但是通过TZ我们可以获得特定时区的时间。比如:
1 2 | $ TZ=EST+5 date Tue 05 May 2020 09:42:34 AM EST |
POSIX.1系统,TZ变量的值有3种形式,GNU C Library最常用的是最后一种形式,指定一个time zone database的路径,前两种格式直接指定time zone信息。
POSIX.1标准只详细规范了前两种格式。
第一种,指定一个名字和偏移,不支持 Daylight Saving Time ( or summer time)。
std offset
std指定时区的名字,至少3个字符,不能包含开头的冒号,数字,逗号,加减号,std和offset之间没有空白。偏移的格式为 [+|-]hh[:mm[:ss]]
举个例子:
EST+5
第二种格式:
std offset dst [offset],start[/time],end[/time]
具体参考glibc手册。
第三种格式,使用一个冒号跟一个路径,这个路径指定的是个database文件。在GNU C Libarary,默认的时区是TZ:=/etc/localtime,或者是TZ:=/usr/local/etc/localtime,依赖于C库的配置。
在我的ubuntu系统中,所有的时区数据库放在/usr/share/zoneinfo,/etc/localtime指向其中的一个数据库:
$ ls -l /etc/localtime
lrwxrwxrwx 1 root root 34 Nov 25 22:09 /etc/localtime -> /usr/share/zoneinfo/Asia/Chongqing
参考:
GNU C library manual.