3

我在莫斯科时区配置了一个系统。莫斯科每年三月的最后一个星期日进入夏令时。莫斯科夏令时 (MSD) 为 UTC +4 小时。在 10 月的最后一个星期日,夏令时结束并回到莫斯科标准时间 (MSK),即 UTC +3 小时。

从 MSD 到 MSK 的过渡发生在 10 月的最后一个星期日凌晨 3 点。到凌晨 3 点,时钟再次重置回凌晨 2 点。因此,在 10 月的最后一个星期日,将有两次凌晨 2 点。在凌晨 2 点的第一个实例中,莫斯科仍处于 MSD(UTC +4)。第二次凌晨 2 点,莫斯科在 MSK(UTC +3)。

我的问题是,如果我使用 localtime() 函数在 10 月的最后一个星期日凌晨 2 点的第二个实例获取本地时区信息,tm_isdst 标志是由 localtime() 设置还是不设置。我的观察是 tm_isdst 标志是由 localtime() 在 MSK 的凌晨 2 点到凌晨 3 点(第二个实例)的一小时窗口期间设置的。这是错误还是预期的行为?

作为记录,我的时区/欧洲 tz 数据库文件是最新的,并且相应的时区数据库文件由 zic 编译器正确编译为 /usr/share/zoneinfo/Europe/Moscow。

4

1 回答 1

0

从规范中的一些研究来看,C 似乎从环境变量中确定了所有这些信息。在这种情况下,为 POSIX 指定了 TZ 环境变量。Windows 将其存储在注册表位置。在这 1 小时期间,您显然不再处于夏令时,因此根据 tm_isdst 标志的定义,应该很清楚。

要知道它是否是编译器/库实现或操作系统的错误,您必须在此期间直接检查环境变量值。

于 2011-02-17T09:07:18.527 回答