c – 给定有效的struct tm时,mktime返回-1

#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[])
{
    struct tm stm;
    stm.tm_sec = 27;
    stm.tm_min = 5;
    stm.tm_hour = 18;
    stm.tm_mday = 2;
    stm.tm_mon = 0;
    stm.tm_year = 43;
    stm.tm_wday = 0;
    stm.tm_yday = 0;
    printf("%d\n", mktime(&stm));
    getchar();
    return 0;
}

打印-1

我有什么误会?

[编辑]这是使用32位目标的Visual Studio 2012.我想跟进的问题是“存储任意日期/时间值的推荐方法是什么(即可能在1900年之前的那些)?”

最佳答案
在你的情况下,43(1943)被认为是无效年份.原因是mktime返回time_t类型.这种类型并不是真正标准化的.文件说的是什么:

The time_t type is an integral value representing the number of
seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. And tm_year is the
number of years since 1900

这个链接What is ultimately a time_t typedef to?说:

time_t represents the number of seconds since the start of the Unix
epoch: midnight UTC of January 1, 1970 (not counting leap seconds).
Some systems correctly handle negative time values, while others do
not
.

如果我们认为time_t是带符号的32位整数,那么在最佳情况下,您可以创建~13 / 12/1901和19/1/2038之间的日期

但在您的情况下,实现不使用time_t的负面部分,因此您无法使用mktime在1970年之前创建日期.

转载注明原文:c – 给定有效的struct tm时,mktime返回-1 - 代码日志