difftime在特定日期返回奇怪的值

时间:2014-11-06 20:06:24

标签: c++ c time mingw ctime

我不明白为什么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(&currentTime), mktime(&previousTime)) << endl;

打印:

3660

为什么我得到这个价值的任何想法? 我应该得到60,因为有一分钟的差异。 我尝试了一些其他的价值观,他们都工作.. 我正在使用CodeBlocks和mingw。

编辑:答:使用tm_isdst解决了问题!血腥DST:P

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;
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(&currentTime), mktime(&previousTime)) << endl;

1 个答案:

答案 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(&currentTime);

建议在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_wdaytm_yday中的原始值将被mktime()忽略并重新计算。其他领域&#39;原始值不限于其正常范围,也会重新计算。

** tm_isdst的正值或零值会导致mktime函数最初假设夏令时分别在指定时间内有效或无效。负值会导致它尝试确定夏令时是否在指定时间内有效。