为什么 zone.tab 缺少这么多时区?

Jon*_*vis 13 timezone

在典型的 *nix 框(在 /user/share/zoneinfo 中)上有超过一千个时区文件。其中许多仅在历史日期上有所不同,这与只关心最近日期或什至只关心当前时间的程序几乎没有关系。但无论如何,它们有很多,通过设置 TZ 环境变量,选择它们中的任何一个作为系统的时区以及将它们中的任何一个用于特定程序或 shell 是完全合法的。它们都是有效的。

然后是 zone.tab 文件(/usr/share/zoneinfo/zone.tab)。它只列出了 400 多个时区(在我的系统上是 414 个)。它缺少很多时区。那么,问题是为什么?为什么他们都不在里面?而且由于它们并不都在那里,如何决定将哪些放在那里?

zone.tab 确实包括一个国家代码以及它列出的每个时区的经度和纬度(这大概是文件存在的原因),并不是所有的时区都真的有这些(例如 UTC 没有那些,并且它不在 zone.tab 中),所以很明显,并不是每个时区都可以在 zone.tab 中列出。但是为什么文件中没有列出所有与实际城市或地区相对应的(大多数都这样做)?为什么只有 414 而不是实际可用的 1000+?

Mik*_*kel 7

标题为重新请求包含 zone.tab 的线程提供了一些zone.tab用途的解释。

它的主要用途似乎是显示城市及其位置的地图,以允许用户通过单击附近的城市来选择他们的时区。

考虑到这一点,它不需要知道每个城市的所有别名,知道一种首选的引用方式就足够了。(但它似乎总是包含每个国家/地区至少一个城市。)

每个区域的其他别名存储在tzdata源代码中。

例如,backward文件有

Link    Asia/Kolkata        Asia/Calcutta
Run Code Online (Sandbox Code Playgroud)

以便人们可以使用新拼写或旧拼写。

中的所有其他文件/usr/share/zoneinfo都是使用zic.

但是没有 600 多个别名,那么为什么会有很大的不同呢?

还有平时生成的每个时区的三个版本:posixright,和系统的默认设置。

$ cd /usr/share/zoneinfo
$ find right -type f | wc -l
581
$ find posix -type f | wc -l
581
$ find . \( -name posix -o -name right \) -prune -o -type f | wc -l
586
Run Code Online (Sandbox Code Playgroud)

所述tzcode Makefile显示了如何那些产生,并提到他们的原因:posix忽略闰秒,right包括它们。

也可以看看: