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执行日期和时间更改为"6.01.2009 23:00:00"之后。

我没有问题,然后我为"06.01.2009 00:00:00"

或"08.01.2009 00:00:00"构建时间。如果我将时区切换到另一个时区,则"7.01.2009 00:00:00"没有任何问题。

造成这种奇怪现象的原因可能是什么,我该如何解决这个问题?

当执行转换为time_t时,mktime需要猜测输入是否为DST(夏令时)。为此,使用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中的"挂钟"信息不足以确定确切的时间。

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

相关内容

  • 没有找到相关文章

最新更新