linux内核时区文件编辑器——ZIC时区编辑

背景

由于项目需求,自带linux时区文件无法满足需要,虽然/usr/share/zoneinfo/Etc下的时区文件不带夏令时,但是缺少几个时区文件,比如比GMT-0少3个半小时的时区文件,故采用ZIC编辑器生成对应时区文件,使其不带夏令时规则。

创建步骤

1、首先创建一个txt文件,其中包含时区信息,具体规则如下:

Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
NAME:时区的名称,被作为为时区而生成的时间转换文件的名字。
GMTOFF:偏移量,为得到本时区的标准时间而应加到 UTC 时间上的时间量。负值 (即以负号开始)表示要从 UTC 时间上减去的时间量。
RULES/SAVE:规则/补偿,本时区应用的规则的名字,或者是应加到本地标准时间上的时间量 。如果本字段是 - ,则本时区总是用标准时间。
FORMAT:本时区的时区缩写的格式。字符对 %s 表示时区缩写的 。另外,/ 符号(斜扛) 分隔标准时和夏令时的缩写。
UNTIL:是某个位置的 UTC 偏移量或规则改变的时间。

例:Zone GMT+330 -3:30 - GMT

需要注意的是,txt文件最后需要一行空白行结尾

2、使用zic编辑器对其进行编辑,得到对应二进制的时区文件

3、在程序中,采用软链接方式,将时区文件软链接到/etc/localtime,这样采用内核命令date出来的时区信息就会正确。

涉及知识点(有待进一步研究)

1、程序中配置的环境变量(时区环境变量TZ)无法配置到内核中,也即程序中配置的TZ环境变量无法被date命令识别到。
2、date命令查找时区信息,首先找TZ环境变量,其次是找/etc/localtime文件,找不到则以UTC-0时区信息显示。
3、time命令显示的时间:从1970年1月1日0点0分0秒到现在时间的秒数;其中这个现在时间指的是linux系统时间(比如程序中使用stime设置UTC-0时间为系统时间,则time函数出来的就是从1970年1月1日0点0分0秒到UTC-0的时间,如果用stime设置系统时间为北京时间,则相应的结果就是到北京时间经过的秒数)


版权声明:本文为q793145253原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。