mktime()奇怪地改变了date

我正在使用gcc编译器在我的RedHat Linux机器上编写一个C程序,它将接受两个date作为input并计算它们之间的差异。

但是,我发现mktime()一个奇怪的行为,如下面的代码段所示。


 struct tm t; t.tm_year=4; t.tm_mon=9; t.tm_mday=30; t.tm_hour=0; t.tm_min=0; t.tm_sec=0; printf("%d-%d-%d %d:%d:%d\n", t.tm_year, t.tm_mon, t.tm_day, t.tm_hour, t.tm_min, t.tm_sec); //result: 4-9-30 0:0:0, which means 1904 Oct 30 00:00:00 mktime(&t); printf("%d-%d-%d %d:%d:%d\n", t.tm_year, t.tm_mon, t.tm_day, t.tm_hour, t.tm_min, t.tm_sec); //result: 4-9-29 23:36:36, which means 1904 Oct 29 23:36:36 

正如你所看到的, struct tmmktime()之后被移动,看起来不合理。

我做了很多testing,发现这种奇怪的行为只发生在1904年10月30日00:00:00 – 00:23:24之间的date分配。

此外,我已经在我的unix服务器(HP-UX)中testing了相同的代码,并且运行完美无缺。

我想知道有没有人有过类似的经验,如果有谁可以给​​我提示发生了什么事情?

我正在香港时区跑步。

mktime()函数假定输入表示本地时间。 当地时间在各个地方有不同时间的奇怪变化。

知道你的时区是什么会有帮助。 如果您将时区设置为UTC,则怀疑问题会消失。

我自己没有看到这个问题(我在太平洋夏令时,在UTC以西7小时)。

这与卢森堡同年6月份的时间表相似,当地时钟向前移动了35分24秒。 1904年10月30日是一个星期天,这是一个转变的可能时间。

另见关于1927年上海时间变化的问题 (这恰好是Jon Skeet得分最高的答案)。

更新 :发现它,感谢Frxstrem的评论。 1904年10月30日,香港发生了一次时间变化,从LMT到HKT。 如果(a)你的时区设定为香港时间,(b)你的系统的时区资料库足够详细,以反映这个特定的变化,我预计会出现症状。

http://www.timeanddate.com/time/change/hong-kong/hong-kong?year=1904


下面是你的程序的修改版本,更清楚地显示了这个问题:

 #include <time.h> #include <stdio.h> int main(void) { struct tm t = { .tm_year = 4, .tm_mon = 9, .tm_mday = 30, .tm_hour = 0, .tm_min = 0, .tm_sec = 0, .tm_isdst = -1, /* let mktime() figure it out */ }; printf("%04d-%02d-%02d %02d:%02d:%02d\n", 1900+t.tm_year, 1+t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); // output: 1904-10-30 00:00:00 mktime(&t); printf("%04d-%02d-%02d %02d:%02d:%02d\n", 1900+t.tm_year, 1+t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); // output: 1904-10-29 23:36:42 } 

它为tm_isdst成员分配一个值,你不这样做; 与未初始化的值,你可以有不可预知的行为。 另外,你的程序拼错tm_mday tm_day

这是我的系统上的输出:

 $ ./c 1904-10-30 00:00:00 1904-10-30 00:00:00 $ TZ=Asia/Hong_Kong ./c 1904-10-30 00:00:00 1904-10-29 23:36:42 $ 

关于我如何能够很快找出这个问题的一些背景知识(这可能对其他人看到类似症状有帮助):

这个问题强烈地提醒我这个 ,我熟悉的只是因为它得到了Stack Overflow 得分最高的用户 得分最高的答案 。 这是纯粹的运气。

由于我最初不知道时区,因此Google搜索“1904年时间变更”的页面出现在这个页面上,讨论了卢森堡同一时间的类似时间变化。 世界其他地区在同一时间做出类似的变化似乎是合理的,可能是向现代标准时区过渡的一部分。

Frxstrem的评论指出:谷歌搜索“1904年香港时间变更”找到了这个页面 。