其他分享
首页 > 其他分享> > mktime和timelocal之间的区别

mktime和timelocal之间的区别

作者:互联网

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

这是我所期待的.然后我用mktime替换了timelocal并发现这是输出:

Timestamp: 1332645300.
Timestamp: 1332648900.

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

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

在Linux Kubuntu上,使用这两个函数,我得到一个小时被添加到tm结构和返回值.

谁能解释为什么?

解决方法:

OpenBSD的timelocal人称:

timelocal is a deprecated interface that is equivalent to calling
mktime() with a negative value for tm_isdst

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

由于timelocal已被弃用,因此可能会有更新的符号来正确处理DST.

标签:c-3,mktime,linux,timezone,macos
来源: https://codeday.me/bug/20190826/1728484.html