zdump 从哪里获取所有这些时间转换?

zdump 从哪里获取所有这些时间转换?

我最近写了一些代码解析来自 Olson zoneinfo 数据库的二进制时区数据。据我所知,我的代码是正确的并且匹配规格如C中所写。

但是,当将我的工具的结果与标准zdump工具的输出进行比较时,我得到了不同的结果!这很奇怪,因为在我看来,我们是根据数据进行工作的。这是我的工具产生的结果:

$ ./mytool /usr/share/zoneinfo/Pacific/Honolulu
3137684296: name:HDT   offset:-34200 DST:true  type:Wall
3139531096: name:HST   offset:-37800 DST:false type:Wall
3414769096: name:HDT   offset:-34200 DST:true  type:Wall
3529591096: name:HST   offset:-37800 DST:false type:Wall
3582817096: name:HST   offset:-36000 DST:false type:Wall

这就是zdump给我的:

$ zdump -v /usr/share/zoneinfo/Pacific/Honolulu
/usr/share/zoneinfo/Pacific/Honolulu  Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Apr 30 12:29:59 1933 UTC = Sun Apr 30 01:59:59 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Apr 30 12:30:00 1933 UTC = Sun Apr 30 03:00:00 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun May 21 21:29:59 1933 UTC = Sun May 21 11:59:59 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun May 21 21:30:00 1933 UTC = Sun May 21 11:00:00 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Feb  9 12:29:59 1942 UTC = Mon Feb  9 01:59:59 1942 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Feb  9 12:30:00 1942 UTC = Mon Feb  9 03:00:00 1942 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun Sep 30 11:29:59 1945 UTC = Sun Sep 30 01:59:59 1945 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun Sep 30 11:30:00 1945 UTC = Sun Sep 30 01:00:00 1945 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Jun  8 12:29:59 1947 UTC = Sun Jun  8 01:59:59 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Jun  8 12:30:00 1947 UTC = Sun Jun  8 02:30:00 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Jan 18 03:14:07 2038 UTC = Sun Jan 17 17:14:07 2038 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Tue Jan 19 03:14:07 2038 UTC = Mon Jan 18 17:14:07 2038 HST isdst=0

有一个很多那里有更多数据!而且 14 行不是 5 行的倍数,所以我真的不得不问 - 它从哪里获取所有这些数据?是否zdump查询一些我不知道的其他数据源?

奇怪的是,对于一些zoneinfo 文件,结果看起来或多或少是正确的。但奇怪的是,我报告的所有 Unix 时间戳都是将来。比我更了解 tz 数据库的人可以解释这种奇怪的行为吗?

答案1

Zdump 报告在 32 位 time_t 范围的开头和结尾有一个额外的假“转换”。这解释了 1901 和 2038 值,以及为什么它会显示 7 个转换而不是 5 个。它还成对报告时间转换 - 一个紧接在每个转换之前,一个紧接在每个转换之后。因此你得到 14 个而不是只有 7 个。

顺便说一句,您应该知道 zdump 不能通过直接迭代 zoneinfo 文件的内容来工作,而是通过使用 localtime 函数尝试各种 time_t 值来工作。通过这种方式,它与 POSIX 风格的 TZ 说明符一起工作,就像与实际的 zoneinfo 文件一起工作一样。 (我也曾经修改过它来报告本机 Windows 时区的转换,因此它根本不依赖于任何 zoneinfo 内部结构)

您所有工具的时间戳都是“未来”的原因是您将负值(太平洋/檀香山的所有转换均在 1970 年之前)误解为无符号值。

相关内容