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