2016-02-19 27 views
1

我有这样的:相同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是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)); 
} 

在这里,我有这样的结果:

result 2=1455775200 
result 1=1455782400 

result 1现在是正确的,但result 2是一个小时为时尚早。看起来内部glibc结构在第一次调用时没有正确初始化。

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

+0

我无法在OS X上使用铿锵700.1.81复制你的结果。我处于与你不同的时区。你似乎在中欧时间?这可能会导致问题。尝试使用'timegm'而不是'mktime'来消除时区。你可以验证你的时区吗?你也应该手动打印'&timeinfo'来验证'strptime'或'mktime'是否有问题。 – Schwern

回答

4

OK,该解决方案是在man网页:

原则上,此功能不会初始化TM,但只存储 指定的值。这意味着tm应该在调用之前初始化为
。不同的UNIX
系统之间的细节有点不同。 glibc的实现不会触及那些没有明确指定的字段,只是它会重新计算tm_wday
和tm_yday字段,如果有任何年份,月份或日期元素发生了变化。

bzero(&timeinfo, sizeof(timeinfo));现在它工作。

+0

或'struct tm timeinfo = {0};' – chux

+0

@chux我正在使用'-Wall -Wextra -Werror',这对'gcc'不起作用。有很多“旧”结构,我必须使用'bzero()'初始化'' –

+0

许多方法来零数据。由于未定义'struct tm'的总字段数,'bzero()'比试图将单个字段置零要好。好,它适合你。 – chux

相关问题