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

Cha*_*eck 9 c++ time

#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;
}
Run Code Online (Sandbox Code Playgroud)

打印-1

我有什么误会?

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

ben*_*bin 15

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

time_t类型是一个整数值,表示自UTC时间1970年1月1日00:00后经过的秒数.而tm_year是自1900年以来的年数

这个链接什么是time_t typedef到底是什么?说:

time_t表示自Unix纪元开始以来的秒数:1970年1月1日的午夜UTC(不计算闰秒).有些系统正确处理负时间值,而有些则没有.

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

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