mkTime() 函数没有选择正确的时区 C++

mkTime() function does not pick correct timezone c++

提问人:Hussey 提问时间:11/17/2022 最后编辑:Hussey 更新时间:11/17/2022 访问量:66

问:

我从用户那里获取输入日期并将其转换为 tm struct(使用本地时间设置 tm struct 的 is_dst、时区和 gmtoff 参数),但是当我使用 mkTime 获取纪元值时,它会更改 tm struct 的时区和 gmtOffset 属性并返回错误的偏移值。

tm tmStartDateTime = {};
string dateString = inputDate;            
if (myclass::tryParseString(inputDate, "%Y/%m/%d %H:%M:%S", tmStartDateTime))// converting string date to tm
{                
   struct timespec now = {0};
   clock_gettime(CLOCK_REALTIME, &now);
   tm *nowStruct = localtime(&now.tv_sec);

   // setting isdst, gmtoff and timezone using localtime
   tmStartDateTime.tm_isdst = nowStruct->tm_isdst; 
   tmStartDateTime.tm_gmtoff = nowStruct->tm_gmtoff; 
   tmStartDateTime.tm_zone = nowStruct->tm_zone;                
                
   tm bmStartDate = {};                 
   bmStartDate = tmStartDateTime;
                               
   StartDateTimeEpoch = mktime(&bmStartDate);
}

例如,如果用户给出的日期为 01/01/1970 00:00:00,并且机器时区设置为欧洲/伦敦,则 tm struct gmtoffset 值更改为 3600,时区更改为 BST,而机器时区为 GMT,0 gmtoffset,因为夏令时于 2022 年 10 月 30 日结束。为什么以及如何更改 mktime 更改 tm 结构的时区和 gmtoffset 值。(注意:机器的TZ变量设置为空字符串,我也将其更改为欧洲/伦敦,但没有运气)

C++ Linux 日期时间 纪元 MKTimtime

评论


答:

1赞 Ross Smith 11/17/2022 #1

localtime()使用传递给它的时间的 DST 设置,而不是调用函数的当前时间。夏令时于 1970 年 1 月 1 日在英国生效,因此无论夏令时今天是否生效,它都将恢复夏令时。

评论

0赞 Hussey 11/21/2022
我不知道夏令时时间在(1968 年 10 月 27 日至 1971 年 10 月 31 日)之间遵循一整年,我以为它遵循每年 3 月至 10 月的相同周期。谢谢