为什么mktime为我的std :: tm返回-1

时间:2014-05-27 16:31:15

标签: c++ datetime c++11 time mktime

我有一个看起来正确的std::tm

enter image description here

但是,在使用mktime进行规范化时,我看到了-1

根据man mktime

The mktime() function returns the specified calendar time; if the calendar time cannot be represented, it returns -1;

然而,看一下我发布的截图,我看不出std::tm tm_gmtofftm_zone出现问题有什么问题?

1 个答案:

答案 0 :(得分:2)

tm_year对象的struct tm成员表示自1900年以来的年份,而不是年份数。将tm_year设置为2014指的是3914年,可能超出time_t的范围。在许多系统上,time_t值是一个带符号的32位整数,表示自1970-01-01 00:00:00 UTC以来的秒数,该值在2038年溢出。

原因是历史性的。当这个界面被发明时,使用2位数存储了数年,因为这在当时似乎是合理的。它后来被更新为能够始终如一地引用1999年之后的数年,但是如果不破坏现有代码就不可能改变现有值。

要注意的其他事项:tm_mon成员将1月编码为0,将12月编码为11;这可以方便地用作月份名称数组的索引。示例中的tm_mon值为5表示六月,而不是五月。

tm_gmtofftm_zone成员是非标准成员;它们特定于您的实施。允许实现向struct tm添加其他成员,但您应该知道列表中只有前9名成员是标准成员;依赖于任何其他代码的代码将不可移植。