我想使用 c
中的 mktime
将 struct 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
最佳答案
您有未定义的行为,因为 _tm
未正确初始化。
函数strptime只会设置格式字符串中指定的成员,其他成员将保持不变,因此它们的值将是不确定的。
然后函数 mktime 将修复不在范围内的值,从而为您提供截然不同的时间,因为 _tm
中的成员值未初始化。
解决方案是正确初始化:
struct tm _tm = { 0 };
(并且不要在名称中使用前缀 _
,因为它是 C 保留的)
关于c - MK时间 : unexpected result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522739/