TZFILE - Linux手册页
Linux程序员手册 第5部分
更新日期: 2020-04-27
名称
tzfile-时区信息
说明
ds--tzset(3)使用的时区信息文件通常位于名称类似于/ usr / share / zoneinfo的目录下。这些文件使用Internet RFC 8536中描述的格式。每个文件都是8位字节的序列。在文件中,二进制整数由网络顺序的一个或多个字节(高位字节或高位字节在前)的序列表示,所有位有效,带符号的二进制整数用二进制补码表示,布尔值表示用一个1字节的二进制整数表示,该整数可以为0(假)或1(真)。格式以包含以下字段的44字节标题开头:
- *
- 神奇的四字节ASCII序列将文件标识为时区信息文件。
- *
- 一个字节,用于标识文件格式的版本(从2017年开始,是ASCII NUL或
- *
- 包含零的十五个字节保留供将来使用。
- *
- Six four-byte integer values, in the following order:
- tzh_ttisutcnt
- 文件中存储的UT /本地指示符数。 (UT是世界标准时间。)
- tzh_ttisstdcnt
- 文件中存储的标准/墙指示器的数量。
- tzh_leapcnt
- 数据条目存储在文件中的seconds秒数。
- tzh_timecnt
- 数据条目存储在文件中的过渡时间数。
- tzh_typecnt
- 在文件中存储数据条目的本地时间类型的数量(不得为零)。
- tzh_charcnt
- 文件中存储的时区缩写字符串的字节数。
上面的标头后面是以下字段,其长度取决于标头的内容:
- *
- tzh_timecnt四字节带符号整数值,以升序排序。这些值以网络字节顺序写入。每个都用作转换时间(由time(2)返回),计算本地时间的规则在该转换时间处更改。
- *
- tzh_timecnt一字节无符号整数值;每个(最后一个)告诉文件中描述的本地时间类型的不同类型中的哪一个与从相同索引的过渡时间开始一直持续到但不包括下一个过渡时间的时间段相关联。 (最后一次出现的类型仅用于与下面所述的POSIX样式的TZ字符串进行一致性检查。)这些值用作下一个字段的索引。
- *
- tzh_typecnt
ttinfo
entries, each defined as follows:
struct ttinfo { int32_t tt_utoff; unsigned char tt_isdst; unsigned char tt_desigidx; };
每个结构都按网络字节顺序写为tt_utoff的四字节带符号整数值,后跟tt_isdst的一字节布尔值和tt_desigidx的一字节值。在每个结构中,tt_utoff给出要添加到UT的秒数,tt_isdst告知是否应由localtime(3)设置tm_isdst,并且tt_desigidx充当ttinfo结构后面的时区缩写字节数组的索引。在文件中。 tt_utoff值从不等于-2 ** 31,以使32位客户端对其取反而不会溢出。另外,在实际应用中,tt_utoff的范围为-89999,93599;这样可以通过已经支持POSIX所需范围[-24:59:59,25:59:59]的实现轻松支持。
- *
- tzh_leapcnt对以网络字节顺序写入的四字节值对;每对的第一个值给出发生a秒的非负时间(由time(2)返回);第二个是有符号整数,指定从给定时间开始的时间段内要应用的of秒总数。值对按时间升序排列。每个过渡持续一秒钟,既可以是积极的也可以是消极的。转换之间至少要相隔28天减去1秒。
- *
- tzh_ttisstdcnt标准/墙指示器,每个指示器存储为一字节的布尔值;他们告诉与本地时间类型相关联的转换时间是指定为标准时间还是本地(墙上时钟)时间。
- *
- tzh_ttisutcnt UT /本地指示器,每个指示器存储为一字节的布尔值;他们告诉与本地时间类型关联的转换时间是否指定为UT或本地时间。如果设置了UT /本地指示器,则还必须设置相应的标准/墙壁指示器。
标准/墙壁和UT /本地指示符旨在将TZif文件的转换时间转换为适合通过缺少规则的POSIX样式的TZ字符串指定的另一个时区的转换。例如,当TZ =" EET2EEST"且没有TZif文件" EET2EEST"时,其想法是改编仅出于此目的而存在的,具有众所周知名称" posixrules"的TZif文件的过渡时间。文件"欧洲/布鲁塞尔"的副本,该文件具有不同的UT偏移量。 POSIX未指定这种过时的转换行为,默认规则取决于安装,并且已知没有实现为2037年以后的时间戳提供此功能的支持,因此,希望(例如)希腊时间的用户应改用TZ =" Europe / Athens"更好的历史记录范围,如果需要POSIX一致性并且不需要准确处理较旧的时间戳,请使用TZ =" EET2EEST,M3.5.0 / 3,M10.5.0 / 4"。
如果tzh_timecnt为零或time参数小于文件中记录的第一个转换时间,则localtime(3)函数通常使用文件中的第一个ttinfo结构。
Version 2 format
对于版本2格式的时区文件,上面的标头和数据后跟第二个标头和数据,格式相同,只是每个过渡时间或leap秒使用八个字节。 (Le秒计数仍为四个字节。)在第二个标头和数据之后是一个换行符括起来的POSIX-TZ-environment-variable-style字符串,用于处理文件中存储的最后一个转换时间之后的瞬间,或该文件没有过渡。如果此类时刻没有POSIX表示形式,则POSIX样式的TZ字符串为空(即,换行之间没有任何内容)。如果为非空,则POSIX样式的TZ字符串必须与最后一个转换时间之后的本地时间类型一致(如果存在于八字节数据中);例如,给定字符串,那么如果最后一个转换时间是在7月,则转换的本地时间类型必须指定一个夏时制时间,该时间缩写为UT以东一小时。同样,如果存在至少一个过渡,则时间类型0与从不确定过去到(但不包括)最早过渡时间的时间段相关联。
Version 3 format
对于版本3格式的时区文件,POSIX-TZ样式的字符串可以使用POSIX TZ格式的两个次要扩展名,如newtzset(3)中所述。首先,其过渡时间的小时部分可能是带符号的,范围从-167到167,而不是POSIX要求的从0到24的无符号值。第二,如果DST从1月1日的00:00开始,则全年生效。于12月31日24:00结束,加上夏令时与标准时间之间的差额。
Interoperability considerations
将来对格式的更改可能会附加更多数据。
版本1文件被认为是旧格式,应避免使用,因为它们不支持2038年以后的过渡时间。仅了解版本1的读者必须忽略任何超出版本1数据块的计算范围的数据。
如果必须使用TZ字符串扩展名来准确建模过渡时间,则编写者应生成版本3文件。否则,应生成版本2文件。
由版本1报头和数据块定义的时间变化的顺序应该是由版本2+报头和数据块以及页脚定义的时间变化的连续子序列。该指南可帮助过时的版本1读者与当前读者就连续子序列中的时间戳达成一致。它还允许不支持过时阅读器的编写器在版本1数据块中使用零的tzh_timecnt来节省空间。
时区名称应由字母数字集合中的至少三(3)个和不超过六(6)个ASCII字符组成,这是为了与时区缩写的POSIX要求兼容。
读取版本2或3的文件时,读者应忽略版本1的标头和数据块,除非要跳过它们。
读者应计算标题和数据块的总长度,并检查它们是否都符合实际文件大小,作为文件有效性检查的一部分。
Common interoperability issues
本节介绍了读取或写入TZif文件时的常见问题。其中大多数是生成TZif文件以供较早的读者使用的问题。本节的目标是:
- *
- 帮助TZif编写者输出避免旧的或有故障的TZif阅读器常见的陷阱的文件,
- *
- 帮助TZif读取器在读取将来的TZif写入器生成的文件时避免常见的陷阱,并且
- *
- 帮助任何未来的规范作者查看更改TZif格式时出现的问题。
定义了新版本的TZif格式后,设计目标是即使文件的TZif版本比其设计的版本晚,阅读器也可以成功使用TZif文件。如果无法实现完全的兼容性,则会尝试将故障限制在很少使用的时间戳上,并允许设计器中的一些简单的变通办法,这些生成器旨在生成即使对于较旧版本的读者也有用的新版本数据。本节尝试记录这些兼容性问题和解决方法,以及记录读者中的其他常见错误。
TZif的互操作性问题包括:
- *
- 一些读者仅检查版本1数据。作为部分解决方法,编写器可以输出尽可能多的版本1数据。但是,阅读器应该忽略版本1的数据,并且应该使用版本2+的数据,即使阅读器的本地时间戳只有32位。
- *
- 一些为版本2设计的阅读器在版本3文件的最后一次转换后可能会错误处理时间戳,因为它们无法解析类似TZ的字符串中对POSIX的扩展。作为部分解决方法,编写器可以输出比必要更多的过渡,因此版本2的阅读器仅会处理不远的时间戳。
- *
- 一些为版本2设计的阅读器不支持永久的夏令时,例如,表示永久性的东部夏令时(-04)的TZ字符串。作为部分解决方法,作家可以用标准时间代替东部的下一个时区,例如,永久性的大西洋标准时间(-04)。
- *
- 一些读者忽略了页脚,而是根据上一个过渡的时间类型来预测将来的时间戳。作为部分解决方法,编写器可以输出比必要更多的过渡。
- *
- 一些读者在第一次转换之前不将时间类型0用于时间戳,因为他们使用启发式方法推断时间类型,而启发式方法并不总是选择时间类型0。作为部分解决方法,编写者可以输出虚拟对象(无操作)尽早进行第一次转换。
- *
- 一些读者在时间戳不小于-2 ** 31的第一个过渡之前错误地处理了时间戳。仅支持32位时间戳的阅读器可能更容易出现此问题,例如,当它们处理64位转换时,其中只有一些可以32位表示。作为部分解决方法,编写器可以在时间戳-2 ** 31输出伪转换。
- *
- 如果转换的时间戳具有最小可能的带符号的64位值,则某些读者会对其进行错误处理。不建议时间戳小于-2 ** 59。
- *
- 一些读者对包含或的POSIX样式的TZ字符串处理不当。作为部分解决方法,作者可以避免使用或仅包含字母字符的时区缩写。
- *
- 许多读者错误地处理了包含非ASCII字符的时区缩写。不建议使用这些字符。
- *
- 某些读者可能会误操作时区缩写,该时区缩写包含少于3个或多个6个字符,或者包含字母数字以外的ASCII字符,因此不建议使用这些缩写。
- *
- 某些读者错误地处理了TZif文件,这些文件指定的夏令时UT偏移量小于相应标准时间的UT偏移量。这些阅读器不支持爱尔兰这样的位置,爱尔兰使用的位置与POSIX TZ字符串等效,在夏天遵循标准时间(IST,+01),在冬天遵循夏令时(GMT,+00)。作为部分解决方法,编写器可以输出等效于POSIX TZ字符串的数据,从而交换标准时间和夏时制。尽管此变通办法会错误地确定一年中的哪一天使用夏时制,但它会正确记录UT偏移量和时区缩写。
一些互操作性问题是阅读器错误,在此处列出的大多数警告是对阅读器开发人员的警告。
- *
- 一些读者不支持否定时间戳记。如果分布式应用程序的开发人员需要处理1970年前的数据,则应牢记这一点。
- *
- 一些读者在具有非负时间戳的第一个过渡之前错误地处理了时间戳。不支持否定时间戳记的读者可能更容易出现此问题。
- *
- 一些读者错误地处理时区缩写,例如包含或数字。
- *
- 一些读者处理不正确的UT偏移量超出了-12到+12小时的传统范围,因此不支持Kiritimati这样不在该范围内的位置。
- *
- 一些读者错误地处理了距UT的[-3599,-1]秒范围内的UT偏移量,因为他们将偏移量整数除以3600得出0,然后将小时部分显示为
- *
- 一些读者处理不正确的UT偏移量不是一小时,15分钟或1分钟的倍数。
另外参见
time(2),localtime(3),tzset(3),tzselect(8),zdump(8),zic(8)。
Olson A,Eggert P,MurchisonK。时区信息格式(TZif)。 2019年2月互联网RFC 8536 doi:10.17487 / RFC8536
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。