相同的mktime()结果为不同的日期时间字符串

时间:2016-02-19 19:26:42

标签: c datetime glibc mktime

我有这个:

#include <stdio.h>
#include <time.h>

int main()
{
    struct tm timeinfo;

    strptime( "2016-02-18 09:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo );
    printf( "result 1=%ld\n", mktime( &timeinfo ) );

    strptime( "2016-02-18 08:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo );
    printf( "result 2=%ld\n", mktime( &timeinfo ) );
}

这个MCVE的结果让我抓狂:

result 1=1455778800
result 2=1455778800

1455778800是2016-02-18 07:00:00的UTC时间,因此对于第二个日期时间字符串是正确的。但为什么我得到两个不同的字符串相同的结果呢?

现在这个:

{
    struct tm timeinfo;

    strptime( "2016-02-18 08:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo );
    printf( "result 2=%ld\n", mktime( &timeinfo ) );
    strptime( "2016-02-18 09:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo );
    printf( "result 1=%ld\n", mktime( &timeinfo ) );
}

我有这个结果:

result 2=1455775200
result 1=1455782400

result 1现在正确,但result 2过早一小时。当我第一次调用它时,看起来内部glibc结构没有正确初始化。

我将其链接到系统正在使用的另一个glibc版本。当我将它与系统版本链接时,它就可以工作了。我做错了什么?

1 个答案:

答案 0 :(得分:5)

好的,解决方案在man页面中:

  

原则上,此函数不会初始化tm,只会存储   指定的值。这意味着应该初始化tm   在通话之前。不同的UNIX之间的细节有点不同   系统。 glibc实现不触及那些字段   没有明确指定,除了它重新计算tm_wday
  和tm_yday字段,如果年,月或日元素中的任何一个发生了变化。

bzero(&timeinfo, sizeof(timeinfo));现在可行了。