混淆Linux上的mktime的行为?

我正在使用Suse 10中的mktime(struct tm *)函数。

现在,夏令时启用时,我注意到一些奇怪的行为。 比方说,我已经启用了夏令时,从9月15日18:10开始,夏令时间为30分钟。 现在,当我用tm结构调用具有date为Sep 15 18:10且tm_isdst设置为0的mktime时,只有在tm_isdst设置为1的情况下,才能在tm结构中返回相同的值。

但是,如果通过date为9月15日18:10与tm_isdst设置为1,那么我觉得时间改为17:40。 在9月15日18:10至9月15日18:40之间的时间内,tm结构中的这种修正被注意到,但是之后没有发生修正,并且保持启用dst标志。 即使我通过9月16日18:10的date,没有时间纠正发生只有dst标志保持启用。

我完全困惑。 这是mktime的正确行为吗?

Solutions Collecting From Web of "混淆Linux上的mktime的行为?"

如果当地时间为夏令时改变了30分钟,那么每年有一次30分钟的本地时间发生两次(一次使用DST,一次不使用),另外30分钟从未发生(随着时间的改变而跳过)。

因此,在时钟恢复30分钟内的当地时间是不明确的,除非指定了DST是否有效; 有两个实际的时间,他们可以对应。

时钟提前30分钟内的当地时间无效; 没有实际的时间可以对应(尽管转换可能仍然是通过假设DST是有效的或者没有实现的)完成的。

因此,对于某些当地时间(忽略DST状态),可能存在多于一个相应的UTC时间,但对于任何给定的UTC时间,只有一个可能的本地时间(如果DST调整被适当考虑)。

当你调用mktime ,它会把你给它的本地时间转换为time_t,就好像DST是有效的或者不是有效的,这取决于tm_isdst的值。 您得到的校正值取决于此转换的反向值,系统将根据DST是否在转换时生效的想法确定您是否获得DST时间或非DST时间。 你给它的时间和你回来的时间实际上代表了同一时刻,但是由于不同的DST状态,与UTC有不同的偏移量。

所以是的,这是mktime的正确行为。 根据它如何恰当地表达你所给的时间的想法,它应该使结构中的价值规范化。

这也说明了为什么要注意使用本地时间记录实际事件 – 如果DST状态或UTC偏移量不随时间保存,某些本地时间值可能不明确。

看看这个答案 ,看看是否有帮助。 另外,什么是系统时区偏移? 通过运行检查:

 date +%z