我有一个看起来正确的std::tm
。
但是,在使用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_gmtoff
和tm_zone
出现问题有什么问题?
答案 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_gmtoff
和tm_zone
成员是非标准成员;它们特定于您的实施。允许实现向struct tm
添加其他成员,但您应该知道列表中只有前9名成员是标准成员;依赖于任何其他代码的代码将不可移植。