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系统使用的其他版本链接.当我将它与系统版本链接时,它就可以工作了.我做错了什么?
好的,解决方案在man页面中:
原则上,此函数不初始化tm,但仅存储指定的值.这意味着应
在调用之前初始化tm .不同UNIX
系统之间的细节略有不同.glibc实现不会触及那些
未明确指定的字段,除非它重新计算tm_wday
和tm_yday字段(如果年,月或日元素中的任何一个更改).
bzero(&timeinfo, sizeof(timeinfo)); 现在它的工作原理.