c++ time(NULL)给出不一致的结果

C++ time(NULL) gives inconsistent results

本文关键字:不一致 结果 time NULL c++      更新时间:2023-10-16

我使用下面的函数来获取从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;

我总是得到完全不同的结果,例如:13678164001367812800

相差近4000秒。我希望数字是一样的。有人能看出我做错了什么吗?

是不是没有设置tm_isdst标志?

为了避免由未初始化的内存位置引起的问题(这似乎是您的情况),您应该使用由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更好地回答了你的问题,这只是一个改进你的代码的建议。

这个问题,正如@jmihalicza回答所暗示的那样,是你没有从local结构体设置tm_isdst标志。假定由于您的时间相差一个小时,因此在您的两个结构中有一个标志是相反的,这导致mktime生成的时间相差一个小时。

而不是使用mktime,您可能会发现简单地返回小时,分钟和秒更容易(尽管这在DST转换期间不会很好地工作-我无法从您的问题中看出这是否是您的因素):

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