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

时间:2009-11-19 20:18:22

标签: c time utc dst

函数mktimestruct tm为参数。 struct tm的其中一位成员是tm_isdst。您可以将此设置为1表示冬季,0表示夏令时,或-1表示如果您不知道。

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

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

(我试图回答this question

时遇到了这个问题

1 个答案:

答案 0 :(得分:5)

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

  

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

我看了一下tzcode2017a.tar.gz中的代码,如果你将tm_isdst设置为-1(未知),那么mktime()的行为就像你想要的那样。所以,如果你使用那个(公共领域)代码,你可能会好起来的。引用与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。)