函数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

最佳答案

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

10-04 21:53