我不明白为什么difftime返回一个奇怪的值,所以这里是数据集和我正在使用的代码。
代码:
struct tm currentTime;
currentTime.tm_year = 2014 - 1900;
currentTime.tm_mon = 9 - 1;
currentTime.tm_mday = 6;
currentTime.tm_hour = 23;
currentTime.tm_min = 59;
currentTime.tm_sec = 0;
currentTime.tm_wday = 7 - 1;
struct tm previousTime;
previousTime.tm_year = 2014 - 1900;
previousTime.tm_mon = 9 - 1;
previousTime.tm_mday = 6;
previousTime.tm_hour = 23;
previousTime.tm_min = 58;
previousTime.tm_sec = 0;
previousTime.tm_wday = 7 - 1;
cout << difftime(mktime(¤tTime), mktime(&previousTime)) << endl;
打印:
3660
为什么我得到这个价值的任何想法? 我应该得到60,因为有一分钟的差异。 我尝试了一些其他的价值观,他们都工作.. 我正在使用CodeBlocks和mingw。
编辑:答:使用tm_isdst解决了问题!血腥DST:Pstruct tm currentTime;
currentTime.tm_year = 2014 - 1900;
currentTime.tm_mon = 9 - 1;
currentTime.tm_mday = 6;
currentTime.tm_hour = 23;
currentTime.tm_min = 59;
currentTime.tm_sec = 0;
currentTime.tm_wday = 7 - 1;
currentTime.tm_isdst = - 1;
struct tm previousTime;
previousTime.tm_year = 2014 - 1900;
previousTime.tm_mon = 9 - 1;
previousTime.tm_mday = 6;
previousTime.tm_hour = 23;
previousTime.tm_min = 58;
previousTime.tm_sec = 0;
previousTime.tm_wday = 7 - 1;
previousTime.tm_isdst = - 1;
cout << difftime(mktime(¤tTime), mktime(&previousTime)) << endl;
答案 0 :(得分:3)
在致电mktime()
之前,通常需要设置7个struct tm
字段。由于OP只设置了其中的6个,未初始化的数据位于字段tm_isdst
中,导致意外移动3600秒。
struct tm currentTime;
currentTime.tm_year = 2014 - 1900;
currentTime.tm_mon = 9 - 1;
currentTime.tm_mday = 6;
currentTime.tm_hour = 23;
currentTime.tm_min = 59;
currentTime.tm_sec = 0;
currentTime.tm_isdst = -1; // **
// currentTime.tm_wday = 7 - 1;
mktime(¤tTime);
建议在struct tm
中填充struct tm currentTime = { 0 };
,以确保所有字段都已指定为struct tm
可能包含除9 int tm_sec tm_min tm_hour tm_mday tm_mon tm_year tm_wday tm_yday tm_isdst
之外的字段。
注意:
tm_wday
和tm_yday
中的原始值将被mktime()
忽略并重新计算。其他领域&#39;原始值不限于其正常范围,也会重新计算。
** tm_isdst
的正值或零值会导致mktime
函数最初假设夏令时分别在指定时间内有效或无效。负值会导致它尝试确定夏令时是否在指定时间内有效。