首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mktime :意外结果

mktime :意外结果
EN

Stack Overflow用户
提问于 2016-02-20 11:42:29
回答 1查看 316关注 0票数 3

我想将struct tm转换为time_t,并在c中使用mktime

这是我的代码:

代码语言:javascript
复制
#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;
}

但它给了我一个意想不到的结果:

代码语言:javascript
复制
1: struct tm => 20160220
2: struct tm => 24941121 | time_t: 16563985201
3: struct tm => 24941121 | time_t: 16563985201

显然,_tm的值在mktime中发生了变化,并且返回了一个不正确的值。

我做错什么了?我用gcc版本4.9.2在linux系统上编译了它(64位)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-20 11:47:05

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

函数strptime将只设置在格式字符串中指定的成员,其他成员将不被修改,因此它们的值将是不确定的。

然后,函数mktime将修复不在范围内的值,从而给出一个非常不同的时间,因为在_tm中没有初始化成员值。

解决方案是正确初始化:

代码语言:javascript
复制
struct tm _tm = { 0 };

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35522739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档