这是标准 C 中时间处理接口的(许多)缺陷之一。另请参见Olson时区数据库。例如,没有一种简单的方法可以确定时区何时在冬季和夏季(夏令时和标准)时间之间切换。当然,未来的任何事情都是一种预测——规则集经常变化(当前版本是2017a)。
据您所知,是否有特定于 UNIX 的解决方案?
我查看了 tzcode2017a.tar.gz 中的代码,mktime()
如果您将 tm_isdst 设置为 -1(未知),那里的行为会如您所愿。所以,如果你使用那个(公共领域)代码,你会没事的——可能。引用随 Olson 代码分发的“localtime(3)”:
mktime 将 tm 指向的结构中的分解时间,以本地时间表示,转换为与 time 函数返回的值编码相同的日历时间值。结构的tm_wday
和tm_yday
组件的原始值被忽略,其他组件的原始值不受其正常范围的限制。(正值或零值表示最初假定夏令时(例如,美国的夏令时)分别在指定时间内有效或无效。为负值tm_isdst
导致mktime
tm_isdst
mktime
尝试判断夏令时是否在指定时间生效的功能;在这种情况下,它没有使用一致的规则,并且在稍后提出相同的论点时可能会给出不同的答案。)
我相信关于“一致规则”的最后一个警告意味着,如果时区的规范发生变化(例如,当美国从 4 月的第 1 周更改为 3 月的第 2 周以更改夏令时)意味着如果您在规则更改之前和规则更改之后确定了一段时间,相同的输入数据将给出不同的输出。
(注意在ftp://ftp.iana.org/tz/目录中有有用的 HTML 文件,例如ftp://ftp.iana.org/tz/tz-link.html。)