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

Al *_*ndy 2 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 ) );
}
Run Code Online (Sandbox Code Playgroud)

这个MCVE的结果让我发疯:

result 1=1455778800
result 2=1455778800
Run Code Online (Sandbox Code Playgroud)

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

现在这个:

{
    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 ) );
}
Run Code Online (Sandbox Code Playgroud)

我有这个结果:

result 2=1455775200
result 1=1455782400
Run Code Online (Sandbox Code Playgroud)

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

我将它与glibc系统使用的其他版本链接.当我将它与系统版本链接时,它就可以工作了.我做错了什么?

Al *_*ndy 5

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

原则上,此函数不初始化tm,但仅存储指定的值.这意味着应
在调用之前初始化tm .不同UNIX
系统之间的细节略有不同.glibc实现不会触及那些
未明确指定的字段,除非它重新计算tm_wday
和tm_yday字段(如果年,月或日元素中的任何一个更改).

bzero(&timeinfo, sizeof(timeinfo)); 现在它的工作原理.