【问题标题】:Strange mktime behaviour - Change if return value is assigned to a variable奇怪的 mktime 行为 - 如果将返回值分配给变量,则更改
【发布时间】:2014-09-24 21:14:22
【问题描述】:

我正在尝试一种奇怪的 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;

}

输出:

当前时间:31/7/2014 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;

}

输出:

当前时间:31/7/2014 15:54:0

欢迎任何帮助。 :)

【问题讨论】:

  • time.h 已弃用。使用ctime。或chrono.
  • @chris,感谢您的信息!

标签: c++ timezone mktime


【解决方案1】:

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

例如。 :

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

【讨论】:

  • 但是他正在输出 strptime() 应该填充的所有值。那么未初始化的数据在哪里呢?输出不关心 tm_isdst。
  • @RemyLebeau : tm_isdst,控制夏令时是否生效。 mktime 的行为会根据该字段的值而有所不同。如果它没有被初始化,它可以有任何值。
  • 没关系,我现在明白了。 strptime() 不填tm_isdstmktime() 看着,所以需要手动初始化。
  • 太棒了!我只是初始化变量 wit cT = {0},然后一切正常。非常感谢!
猜你喜欢
  • 2012-10-13
  • 2016-12-19
  • 2019-09-18
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多