时区数据库和 DST

Timezone database and DST

根据 Busybox FAQ,时区的管理方式取决于我系统的 libc。对于我的嵌入式系统,如果我想更改时区,我需要创建一个符号 link 从 /etc/localtime 到 TZ 数据库文件,如下所示:

/etc/localtime -> /usr/share/zoneinfo/Etc/GMT+2

我的问题是关于 TZ 数据库的。

比方说,Asia/JerusalemEtc/GMT+2 之间有什么区别,因为它在时区 GMT+2 中?或者; Australia/MelbourneGMT+11 有什么区别?

我注意到说,例如,墨尔本一年中有 6 个月处于 GMT+11,而一年中剩余的 6 个月处于 GMT+10

符号 link 到 TZ 数据库中的 城市名称 和 link 到 GMT 版本(例如。 Etc/GMT+11)? link加入城市名称是否意味着会自动处理 DST 调整,但对于 GMT 版本则不然?

非常感谢你们!

注意:由于您是在 Busybox 的上下文中提问的,所以这不完全是 on-topic for Whosebug。但是,我还是继续回答吧,因为这里还有很多其他关于TZ数据库的问题与编程相关,这适用于一般情况。

命名的时区,例如Asia/Jerusalem,反映了地理区域的时间。参考点通常(但不总是)是一个城市,它通常(但不总是)是该地区人口最多的城市——不一定是省会城市。

在此地理区域内,跟踪所有时区更改历史。这包括夏令时更改和基准偏移量更改。一个时区在其历史上可以有 许多 变化。您可以在 tzdb 源代码中查看这些更改的丰富细节。例如,here is the entry for Israel.

Etc/GMT-2这样的固定偏移条目主要在TZDB中是为了向后兼容。您会在 etcetera file 中找到它们。它们不针对任何特定地理区域,因此没有任何夏令时规则。

另请注意,由于它们是为向后兼容旧 POSIX 标准而创建的,因此这些偏移量的符号与它们通常的状态 倒置 。因此,Asia/Jerusalem 在标准时间实际上与 Etc/GMT-2 对齐,在白天时间 Etc/GMT-3 对齐。

一般来说,您应该只使用指定的时区。您可以找到它们的列表 on Wikipedia.