【问题标题】:Difference between mktime and timelocalmktime 和 timelocal 的区别
【发布时间】:2012-06-15 19:17:24
【问题描述】:

这两个函数有什么区别?我的理解应该是相同的:http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html

我写了这段代码来测试转换(Qt部分仅供比较):

#include <QCoreApplication>
#include <QDateTime>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   QDateTime datetime(QDate(2012, 3, 25), QTime(5, 15));
   qDebug("Timestamp: %lld.", datetime.toMSecsSinceEpoch()/1000L);

   time_t timestamp;
   tm* timeinfo = localtime(&timestamp);
   timeinfo->tm_hour = 5;
   timeinfo->tm_mday = 25;
   timeinfo->tm_min  = 15;
   timeinfo->tm_mon  = 2;
   timeinfo->tm_year = 112;
   timeinfo->tm_sec  = 0;
   qDebug("Timestamp: %ld.", timelocal(timeinfo));

   return 0;
}

发现输出是:

Timestamp: 1332645300.
Timestamp: 1332645300.

这是我所期望的。然后我用mktime替换了timelocal,发现这是输出:

Timestamp: 1332645300.
Timestamp: 1332648900.

似乎增加了一个小时(考虑我当前的时区是 GMT+2:00 并且我的区域设置为意大利)。为什么?两者有什么区别,为什么mktime会在我设置的日期上加1小时?

编辑:我再次测试,似乎在 Mac OS X(和 iOS)上,timelocal 正在返回与 timeinfo 结构中相同的时间,而 mktime 实际上是在添加返回的time_t 值和结构tm 中的一个小时。

在 Linux Kubuntu 上,使用这两个函数,我发现 tm 结构和返回值都增加了一个小时。

谁能解释一下原因?

【问题讨论】:

  • 我用 C++ 编译器编译。
  • 但是你把它标记为 C,所以要保持一致。现在,我run your code,结果似乎是一样的......
  • 我在我的问题中添加了一些细节。你在哪个平台上运行?
  • 它在ideone.com (gcc 4.3.4) 上编译和运行
  • 好的,问题仍然存在。

标签: c linux macos timezone mktime


【解决方案1】:

OpenBSD 的timelocal 的人说:

<strong>timelocal</strong> 是一个废弃的接口,相当于调用 <strong>mktime()</strong> 为负值 <strong>tm_isdst</strong>

tm_isdst 的负值表示timelocal 不考虑夏令时 (DST)。 QDateTime 似乎也遇到了夏令时问题。
另一方面,mktime 处理夏令时,这可能解释了 OS X 上 1 小时的差异。

由于 timelocal 已被弃用,它可能有更新的实现来正确处理 DST。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2023-03-26
    • 2021-09-29
    • 1970-01-01
    • 2014-04-28
    • 2013-08-07
    相关资源
    最近更新 更多