提问人:Hussey 提问时间:11/17/2022 最后编辑:Hussey 更新时间:11/17/2022 访问量:66
mkTime() 函数没有选择正确的时区 C++
mkTime() function does not pick correct timezone c++
问:
我从用户那里获取输入日期并将其转换为 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变量设置为空字符串,我也将其更改为欧洲/伦敦,但没有运气)
答:
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 月的相同周期。谢谢
评论