如果可能,您应该避免将 tm_isdst 设置为 -1。系统无法始终仅从日期和时间确定 DST 状态。DST 结束前后的一小时不明确。例如,如果您在mktime()
2012 年 11 月 4 日凌晨 1:30 经过,则该信息不足以time_t
从mktime()
. 通常我已经看到mktime()
假设标准时间模棱两可,但我还没有看到任何文档可以保证在所有平台上的行为。2012 年 11 月 4 日凌晨 1:30tm_isdst == 1
会提前 1 小时,因为 1:00:00 到 1:59:59 的时间会重复。
#include <stdio.h>
#include <time.h>
int main()
{
time_t daylight, standard;
struct tm timestr;
double diff;
timestr.tm_year = 2012 - 1900;
timestr.tm_mon = 11 - 1;
timestr.tm_mday = 4;
timestr.tm_hour = 1;
timestr.tm_min = 30;
timestr.tm_sec = 0;
/* first with standard time */
timestr.tm_isdst = 0;
standard = mktime(×tr);
/* now with daylight time */
timestr.tm_isdst = 1;
daylight = mktime(×tr);
diff = difftime(standard, daylight);
printf("Difference is %f hour(s)", diff/60.0/60.0);
return 0;
}
这会产生:
Difference is 1.000000 hour(s)
两者都是 2012 年 11 月 4 日凌晨 1:30,但是两者都是两个不同的 time_t 值,相隔 1 小时。
mktime()
基本上有2个输出:
time 结构既是输入又是输出。它被修改mktime()
为将所有结构成员返回到标称范围。例如,如果您增加 tm_hour 成员+= 500
,这意味着将时间增加 500 小时。tm_hour
成员将更改为 00 到 23 的值,并且,tm_day
等都tm_mday
将相应调整。tm_isdst
既是输入又是输出。其值如下:
- 1(DST 生效,即夏令时)
- 0(DST 无效,即标准时间)
- -1(未知 DST 状态)
因此 mktime() 将为 tm_isdst 输出 1 或 0,而不是 -1。
-1 是一个可能的输入,但我认为它的意思是“未知”。不要认为它是“自动确定”的意思,因为一般情况下,mktime()
不能总是自动确定。
显式 DST 状态(0 或 1)应该来自软件外部的东西,例如将其存储在文件或数据库中,或提示用户。