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

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

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

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

相反,在Linux Kubuntu上,使用这两个功能,我会在tm结构和返回值中添加一个小时。

谁能解释为什么?

最佳答案

OpenBSD的 timelocal 表示:


tm_isdst的值为负表示timelocal不考虑夏令时(DST)。看来QDateTime也有DST的麻烦。
另一方面, mktime 处理DST,这可能解释了OS X上1小时的差异。

由于不推荐使用timelocal,因此它可能具有较新的实现,可以正确处理DST。

08-05 12:30