如何消除不稳定的mktime行为

时间:2015-04-03 22:52:25

标签: mktime

我试图将当地时间转换为自纪元以来的秒数。但是,看起来mktime()总是为同一输入返回相同的值。

以下是代码:

int TimeCreated;
// ...
printf("%d/%d/%d %d:%d:%d\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_c);
TimeCreated = mktime(&t);
printf("%d\n",TimeCreated);
printf("%d/%d/%d %d:%d:%d\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_c);
TimeCreated = mktime(&t);
printf("%d\n",TimeCreated);

似乎每次运行问题时,mktime()的输出都会针对相同的输入值进行更改:

$ ./test1
115/2/28 15:29:1
1427581741
115/2/28 15:29:1
1427581741
$ test1
115/2/28 15:29:1
1427578141
115/2/28 14:29:1
1427578141

手册页说"函数mktime()和timegm()将断开时间(在* timeptr指向的结构中)转换为时间值,其编码与返回值的编码相同通过时间(3)功能(即,从纪元,UTC开始的秒数)。 mktime()函数根据当前时区设置解释输入结构(参见tzset(3))"这表明问题与时区有关。但是,时区设置正确。

如果我从更大的程序中提取上述代码,那么问题就会消失。我怀疑链接和调用jhead中的函数可能是问题的一部分,但我无法通过阅读地图页面来想象它是如何扰乱mktime()结果的。

1 个答案:

答案 0 :(得分:2)

看起来tm_isdst的{​​{1}}字段在第一次调用struct tm之前未初始化。 如果夏令时有效,则值为正,如果不是则为零,如果信息不可用,则为负。