mktime将时间换成一小时

时间:2014-11-17 13:13:40

标签: windows timezone mktime

我遇到了mktime函数的一个有趣问题。我使用俄语时区(UTC + 03:00)Волгоград,Москва,Санкт-Петербург(RTZ 2)/伏尔加格勒,莫斯科,圣彼得堡/并尝试为“7.01.2009 00:00:00”构建time_t

tm localTM;

localTM.tm_sec = 0;
localTM.tm_min = 0;
localTM.tm_hour = 0;
localTM.tm_mday = 7;
localTM.tm_mon = 0;
localTM.tm_year = 109;

time_t t = mktime(&localTM);

mktime执行日期& time更改为“6.01.2009 23:00:00”。

我没有问题然后我为“06.01.2009 00:00:00”或“08.01.2009 00:00:00”建造时间。 如果我将时区切换到另一个,我对“7.01.2009 00:00:00”没有任何问题。

这种奇怪的原因是什么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

执行转换为time_t时,mktime需要猜测输入是否为夏令时(夏令时)。 为此,使用tm.tm_isdst字段。见man mktime

   tm_isdst  A  flag  that  indicates  whether  daylight saving time is in
             effect at the time described.  The value is positive if  day-
             light  saving time is in effect, zero if it is not, and nega-
             tive if the information is not available.

由于您未在代码中初始化tm_isdst,因此使用默认值(0),使mktime认为它在NO-DST期间。 要在代码中修复它,只需添加

即可
 localTM.tm_isdst = -1

注意 - 逻辑是必要的,因为某些时刻只有tm中存储的“wallclock”信息不足以确定确切的时间。

是的,默认行为是这样的事实有点混乱:)