【发布时间】: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(×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替换了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