我有这个:
#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
版本。当我将它与系统版本链接时,它就可以工作了。我做错了什么?
答案 0 :(得分:5)
好的,解决方案在man
页面中:
原则上,此函数不会初始化tm,只会存储 指定的值。这意味着应该初始化tm 在通话之前。不同的UNIX之间的细节有点不同 系统。 glibc实现不触及那些字段 没有明确指定,除了它重新计算tm_wday
和tm_yday字段,如果年,月或日元素中的任何一个发生了变化。
bzero(&timeinfo, sizeof(timeinfo));
现在可行了。