这两个function有什么区别? 这是我的理解,那些应该是相同的: http : //www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html 。
我写了这段代码来testing转换(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.
这是我所期望的。 然后我用mktime
replacetimelocal
,发现这是输出:
Timestamp: 1332645300. Timestamp: 1332648900.
似乎加了一个小时(考虑到我目前的时区是GMT + 2:00,我的区域设置为意大利)。 为什么? 两者之间有什么区别,为什么mktime
在我设置的date增加了1个小时?
编辑 :我再次testing,似乎在Mac OS X(和iOS) timelocal
返回timelocal
结构中放置相同的小时,而mktime
实际上是在返回的time_t
值和结构tm
添加一个小时。
在Linux Kubuntu,而是两个函数,我得到一个小时被添加到tm
结构和返回的值。
任何人都可以解释为什么?
OpenBSD的时间timelocal
说:
timelocal
是不赞成使用的接口,相当于用tm_isdst
的负值调用mktime()
tm_isdst
表示timelocal
不考虑夏令时(DST)。 看来QDateTime
也有DST的麻烦。
另一方面, mktime
处理DST,这可能解释OS X上的1小时差异。
由于timelocal
已被弃用,因此可能有更新的处理DST的正确方法。