Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的std::tm的mktime返回-1_C++_Datetime_C++11_Time_Mktime - Fatal编程技术网

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

C++ 为什么我的std::tm的mktime返回-1,c++,datetime,c++11,time,mktime,C++,Datetime,C++11,Time,Mktime,我有一个看起来正确的std::tm 但是,当使用mktime进行规范化时,我看到一个-1 根据工时: mktime()函数返回 指定的日历时间;如果无法表示日历时间,则返回-1 然而,看看我发布的屏幕截图,我看不出放入std::tm的东西有什么问题tm\gmtoff和tm\u区域是否有问题?struct tm对象的tm\u year成员表示自1900年以来的年份,而不是年份号。将tm\u year设置为2014是指3914年,这可能超出time\t的范围。在许多系统上,time\u t值是一个

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

但是,当使用
mktime
进行规范化时,我看到一个
-1

根据
工时

mktime()函数返回
指定的日历时间;如果无法表示日历时间,则返回-1


然而,看看我发布的屏幕截图,我看不出放入
std::tm
的东西有什么问题
tm\gmtoff
tm\u区域
是否有问题?

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

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

还有一点需要注意:
tm_mon
成员将1月编码为0,12月编码为11;这便于用作月名称数组的索引。示例中的
tm_mon
值5表示六月,而不是五月


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

因此,如果我们将日期存储在:
2014:05:26:16:37:31:1:146
(%Y:%m:%d:%H:%m:%S:%w:%j)中,我需要在创建
std::tm
时从tm年减去1900,并在
tm月添加1。实际上,
tm月
中的
5
对应于6月,不是四月。因为它是以0为基础的,所以你需要加1,而不是减法。@keith-非常感谢你的详细解释。问题解决了。这个答案是正确的,年份需要指定为自1940年以来的年数。另外一条可能对其他人有所帮助的信息是,原始问题中的示例在64位机器下运行良好。我正在开发一个跨平台的应用程序,最近得到了一个bit,因为它可以在64位Ubuntu下工作,但在32位Windows下会失败。