在冬天将夏季日期转换为utc?

And*_*mar 1 c time utc dst

该函数mktime采用struct tmas参数.其中一个成员struct tmtm_isdst.您可以将此设置为1表示冬季,0表示夏令时,如果您不知道,则设置为-1.

但是,如果在冬天,你尝试转换2009-09-01 00:00,mktime虽然目前是冬天,但是没有看到,你转换的日期是夏季.结果就是一个小时的休息时间.对我来说(GMT + 1)2009-08-31 22:00它应该是23:00.

有没有办法确定某个特定日期是在夏季还是冬季?是否有可能在冬季将夏季日期转换为utc?

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

Jon*_*ler 5

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

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

我看了一下tzcode2017a.tar.gz中的代码,mktime()如果你将tm_isdst设置为-1(未知),那么你的行为就像你想要的那样.所以,如果你使用那个(公共领域)代码,你可能会好起来的.引用与Olson代码一起分发的'localtime(3)':

Mktime将由tm指向的结构中的故障时间(以本地时间表示)转换为日历时间值,其编码与时间函数返回的值相同.所述的原始值tm_wdaytm_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.)