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

C++ C++;时间(NULL)给出不一致的结果,c++,time,epoch,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

我有下面的函数来获取今天午夜的秒数

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;

cout是不是tm_isdst标志没有设置?差别正好是1小时。

正如@jmihalicha answer中提到的,问题是您没有从
本地
结构设置
tm_isdst
标志。大概是因为您的时间相差一小时,所以两个结构中的标志是相反的,这两个时间中的一个,导致
mktime
生成一个相差一小时的时间

但是,与使用
mktime
不同的是,您可能会发现简单地将小时、分钟和秒数倒出来更容易(尽管这在DST转换期间不起作用-我无法从您的问题判断这是否是您的一个因素):


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

您可以使用
local
本身来获得
midnight\u epoch
,而不是从头开始创建一个
tm
。这样你就避免了@jmihalicza在回答中指出的问题。你能在代码中说明这是如何工作的,或者在下面添加一个答案吗?这个标志重要吗?它不应该在随后的两次函数调用中给出相同的结果吗?因为DST不会在每个函数调用之间的微秒内发生变化。@user788171:如果不设置该标志,它将保持未初始化状态,因此可以有任何值(取决于堆栈内容)。试试看,我不能用你的原始代码重现你的问题,所以我也不能测试修复。
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);
}