【问题标题】:C++ time(NULL) gives inconsistent resultsC++ time(NULL) 给出不一致的结果
【发布时间】:2013-04-30 20:17:32
【问题描述】:

我有以下函数来获取从纪元到今天午夜的秒数。

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 秒的差异。我希望这些数字是相同的。谁能看到我做错了什么?

【问题讨论】:

  • 您可以使用local 本身来获取midnight_epoch,而不是从头开始创建tm。这样你就可以避免@jmihalicza 在他的回答中指出的问题。
  • 你能在代码中展示它是如何工作的吗?也许可以在下面添加一个答案?

标签: c++ time epoch


【解决方案1】:

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

【讨论】:

  • 这个标志重要吗?它不应该在函数的两个后续调用中给出相同的结果,因为 DST 不会在函数调用之间发生变化,这些函数调用之间发生在微秒内。
  • @user788171:如果您不设置该标志,它将保持未初始化状态,因此可以具有任何值(取决于堆栈内容)。试试吧,我无法用你的原始代码重现你的问题,所以我也无法测试修复。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    正如@jmihalicza 答案中提到的那样,问题是您没有从local 结构中设置tm_isdst 标志。据推测,由于您的时间相差一个小时,因此您的两个结构中的标志是相反的,其中一个是两次,导致 mktime 生成的时间相差一小时。

    但是,除了使用 mktime 之外,您可能会发现简单地取消小时、分钟和秒会更容易(尽管这在 DST 转换期间效果不佳 - 我无法从您的问题中判断这是不是适合你的因素):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多