3

这两个功能有什么区别?我的理解是那些应该是相同的: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.

这是我所期望的。然后我替换timelocalmktime并发现这是输出:

Timestamp: 1332645300.
Timestamp: 1332648900.

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

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

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

谁能解释为什么?

4

1 回答 1

6

OpenBSD 的人timelocal说:

timelocal是一个不推荐使用的接口,相当于 mktime()使用负值调用tm_isdst

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

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

于 2012-06-15T22:08:34.330 回答