奇怪的mktime行为 - 如果将返回值分配给变量,则更改

时间:2014-08-01 15:54:08

标签: c++ timezone mktime

我正在尝试一种奇怪的 mktime()函数行为。当我分配函数返回的值时,输入参数的值是1,而当我没有时,值是不同的。

我已经知道 mktime()调整了 struct tm 输入参数的值,但发生了什么不同,让我们看看带有相应输出的代码:

第一个代码

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc, char** argv) {
    struct tm cT;
    strptime("31/07/2014 16:54:00", "%d/%m/%Y%n%T", &cT);
    mktime(&cT);

    cout << "Current Time: "  << cT.tm_mday << "/" << cT.tm_mon + 1 << "/" << cT.tm_year + 1900 << " " << cT.tm_hour << ":" << cT.tm_min << ":" << cT.tm_sec << endl;

}

输出:

  

当前时间:2014/3/7 16:54:0

第二个代码

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc, char** argv) {
    struct tm cT;
    strptime("31/07/2014 16:54:00", "%d/%m/%Y%n%T", &cT);
    time_t t = mktime(&cT);

    cout << "Current Time: "  << cT.tm_mday << "/" << cT.tm_mon + 1 << "/" << cT.tm_year + 1900 << " " << cT.tm_hour << ":" << cT.tm_min << ":" << cT.tm_sec << endl;

}

输出:

  

当前时间:2014年7月31日15:54:0

欢迎任何帮助。 :)

1 个答案:

答案 0 :(得分:3)

这是忘记初始化变量的经典案例。具体来说,您需要使用适当的值初始化cT变量至少strptime不会触及的所有字段(strptime将仅设置与输入字段描述符对应的字段格式字符串)。

EG。 :

struct tm cT = { 0 };
cT.tm_isdst = -1;
strptime("31/07/2014 16:54:00", "%d/%m/%Y%n%T", &cT);