我有这个:
#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时间,因此对于第二个datetime字符串是正确的。但是,为什么要为两个不同的字符串得到相同的结果?现在这个:
{
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
版本链接。当我将其与系统版本链接时,它将起作用。我做错了什么?
最佳答案
OK,解决方法在man
页面中:
原则上,此函数不初始化tm而是仅存储
指定的值。这意味着应该初始化tm
通话之前。不同的UNIX之间的细节有所不同
系统。 glibc实现不会涉及那些
没有明确指定,只是重新计算tm_wday
和tm_yday字段(如果更改了年,月或日元素)。bzero(&timeinfo, sizeof(timeinfo));
,现在可以使用了。
关于c - 不同日期时间字符串的相同mktime()结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35513395/