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

标签 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 ) );
}


此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/

相关文章:

c - 带有警告的饱和算术问题

c# - 程序不遵循 Windows 机器的日期格式(它可以在某处被覆盖吗?)

c - pread 和 pwrite 未定义?

c - 使用 malloc.c 的堆分配内存边界

java - 面向对象语言和非面向对象语言有什么区别?

c - 2 的补码中的 16 位值,令人困惑

excel - Powershell 从 Excel 列导入的日期和时间格式错误

javascript - 如何将日期时间字符串转换为特定的日期时间格式

memory-leaks - 缺乏释放会导致什么样的问题?

c - 为什么在管道的读取端关闭时不会发生 SIGPIPE?