c - MK时间 : unexpected result

标签 c tm mktime

我想使用 c 中的 mktimestruct tm 转换为 time_t
这是我的代码:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
struct tm _tm;
time_t _t;

  strptime ("20160220", "%Y%m%d", &_tm);
  printf ("1: struct tm => %04d%02d%02d\n", _tm.tm_year+1900
                                          , _tm.tm_mon+1
                                          , _tm.tm_mday);

  _t = mktime(&_tm);
  printf ("2: struct tm => %04d%02d%02d | time_t: %lu\n"
                                                  , _tm.tm_year+1900
                                                  , _tm.tm_mon+1
                                                  , _tm.tm_mday
                                                  , _t);

  _tm = *(localtime(&_t));
  printf ("3: struct tm => %04d%02d%02d | time_t: %lu\n"
                                                  , _tm.tm_year+1900
                                                  , _tm.tm_mon+1
                                                  , _tm.tm_mday
                                                  , _t);
  return 0;
}

但它给了我一个意想不到的输出:

1: struct tm => 20160220
2: struct tm => 24941121 | time_t: 16563985201
3: struct tm => 24941121 | time_t: 16563985201

显然,_tm 的值在 mktime 中发生了变化,并且返回了错误的值。
我做错了什么? 我在 Linux 系统上使用 gcc 版本 4.9.2

编译它(64位)

最佳答案

您有未定义的行为,因为 _tm 未正确初始化。

函数strptime只会设置格式字符串中指定的成员,其他成员将保持不变,因此它们的值将是不确定的。

然后函数 mktime 将修复不在范围内的值,从而为您提供截然不同的时间,因为 _tm 中的成员值未初始化。

解决方案是正确初始化:

struct tm _tm = { 0 };

(并且不要在名称中使用前缀 _,因为它是 C 保留的)

关于c - MK时间 : unexpected result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522739/

相关文章:

c - dsymutil 的 --flat 选项的预期用途是什么

r - R 中的 tm_map 错误消息

r - 如何使用 tm 包删除标点符号而不删除 R 中的句点?

php - 创建 PHP future 日期的更好方法

PHP Mktime 错误

c - Difftime 一直返回 0

c - "Terminated due to time out"C 中的错误,插入排序?

c - 使用 void 指针作为函数参数的问题

C - 如何正确释放指向 n 字符数组 ((*p)[n]) 的指针的内存?

从R中的语料库中删除无意义的单词