2

该函数mktime接受一个struct tm作为参数。的成员之一struct tmtm_isdst。您可以将其设置为 1 表示冬季,0 表示夏季,或 -1 如果您不知道。

但是,如果在冬季,您尝试进行转换2009-09-01 00:00mktime却看不到虽然当前是冬季,但您要转换的日期却是夏季。所以结果是休息一小时。对我来说 (GMT+1) 它是2009-08-31 22:00,而它应该是23:00

有没有办法确定特定日期是在夏季还是冬季?是否可以在冬季将夏季日期转换为 UTC?

(我在试图回答这个问题时遇到了这个问题

4

1 回答 1

5

这是标准 C 中时间处理接口的(许多)缺陷之一。另请参见Olson时区数据库。例如,没有一种简单的方法可以确定时区何时在冬季和夏季(夏令时和标准)时间之间切换。当然,未来的任何事情都是一种预测——规则集经常变化(当前版本是2017a)。

据您所知,是否有特定于 UNIX 的解决方案?

我查看了 tzcode2017a.tar.gz 中的代码,mktime()如果您将 tm_isdst 设置为 -1(未知),那里的行为会如您所愿。所以,如果你使用那个(公共领域)代码,你会没事的——可能。引用随 Olson 代码分发的“localtime(3)”:

mktime 将 tm 指向的结构中的分解时间,以本地时间表示,转换为与 time 函数返回的值编码相同的日历时间值。结构的tm_wdaytm_yday组件的原始值被忽略,其他组件的原始值不受其正常范围的限制。(正值或零值表示最初假定夏令时(例如,美国的夏令时)分别在指定时间内有效或无效。为负值tm_isdst导致mktimetm_isdstmktime尝试判断夏令时是否在指定时间生效的功能;在这种情况下,它没有使用一致的规则,并且在稍后提出相同的论点时可能会给出不同的答案。)

我相信关于“一致规则”的最后一个警告意味着,如果时区的规范发生变化(例如,当美国从 4 月的第 1 周更改为 3 月的第 2 周以更改夏令时)意味着如果您在规则更改之前和规则更改之后确定了一段时间,相同的输入数据将给出不同的输出。

(注意在ftp://ftp.iana.org/tz/目录中有有用的 HTML 文件,例如ftp://ftp.iana.org/tz/tz-link.html。)

于 2009-11-19T20:28:49.043 回答