C ++时间(NULL)给出不一致的结果

时间:2013-05-07 00:53:14

标签: c++ time epoch

我有以下功能来获取当天午夜以来的秒数。

long int midnight_time()
{
  time_t t;
  struct tm *local;
  t = time(NULL);
  struct tm timeinfo;
  local = localtime(&t);
  timeinfo.tm_year = local->tm_year;
  timeinfo.tm_mon = local->tm_mon;
  timeinfo.tm_mday = local->tm_mday;
  timeinfo.tm_hour = 0;
  timeinfo.tm_min=0;
  timeinfo.tm_sec=0;
  long int midnight_epoch = mktime(&timeinfo);
  return midnight_epoch;
}

当我在代码中相继调用此函数两次时,例如

cout<<midnight_time()<<endl;
cout<<midnight_time()<<endl;

我一直得到截然不同的结果,例如: 1367816400 1367812800

这是差不多4000秒。我希望数字是一样的。谁能看到我做错了什么?

3 个答案:

答案 0 :(得分:5)

是不是tm_isdst标志未设置?差异恰好是1小时。

答案 1 :(得分:1)

@jmihalicza回答中提到的问题是,您没有从tm_isdst结构中设置local标志。大概是因为你的时间相差一小时,两个结构中的一个标志在两个结构中相反,导致mktime生成一个小时不同的时间。

不过使用mktime,您可能会发现简单地退出小时,分钟和秒钟更容易(虽然这在DST过渡期间无法正常工作 - 我无法从您的问题中判断出来这是你的一个因素):

return t - (timeinfo.tm_hour * 3600) - (timeinfo.tm_min * 60) - timeinfo.tm_sec;

答案 2 :(得分:1)

为了避免由未初始化的内存位置(这似乎是您的情况)引起的问题,您应该使用localtime函数返回指针的tm结构。这是一个例子:

time_t midnight_time()
{
  struct tm *local;
  time_t now = time(NULL);
  local = localtime(&now);

  local->tm_hour = 0;
  local->tm_min=0;
  local->tm_sec=0;

  return mktime(local);
}

@jmihalicza更好地回答了您的问题,这只是改善您的代码的建议。