2014-11-06 67 views
1

我不明白爲什麼difftime會返回一個奇怪的值,所以這裏是數據集和我正在使用的代碼。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,因爲有一分鐘的差異。 我嘗試了一些其他的值,他們都工作.. 我用mingw使用CodeBlocks。

編輯:回答:使用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

除了這個不編譯[因爲成員名稱不正確](http://en.cppreference.com/w/cpp/chrono/c/tm),一旦你修正了錯誤[你按預期得到60。](http://coliru.stacked-crooked.com/a/af76e98edee8cdbb)。 TL;博士;不能重現。 – Borgleader 2014-11-06 20:09:22

+0

@Borgleader對不起,我沒有很好地複製我的程序。我用新的值更新了它,但我仍然得到一個奇怪的值:3660 – 2014-11-06 20:12:36

+0

因此,您的代碼中實際上包含'previousTime.tm_hour = 22;'。 – 2014-11-06 20:16:13

回答

3

在致電mktime(),通常需要設置的struct tm 7場。由於OP僅設置了其中的6個,未初始化的數據在字段tm_isdst中導致3600秒的意外變化。在struct tm currentTime = { 0 };

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可以含有除了9個字段:int tm_sec tm_min tm_hour tm_mday tm_mon tm_year tm_wday tm_yday tm_isdst


注:

tm_wdaytm_yday原來的值被忽略,被mktime()重新計算。其他字段的原始值不限於其正常範圍,並且也被重新計算。

** tm_isdst的正值或零值會導致mktime函數最初假定夏令時分別對指定時間有效或無效。負值導致它試圖確定夏令時是否在指定時間內有效。

+0

這裏很好的解釋。基本上,在使用變量之前填充變量比較安全? – 2014-11-06 21:18:58

+1

@Hawknight由於'struct tm'至少具有定義良好的9個字段,所以可移植代碼不應該冒其他人未初始化的風險。一般來說,當使用不自己製作的結構時,最好在使用前將它們清零。如果你的代碼沒有被填滿,事情就會像預期的那樣,除了接近DST轉換。如果不深入挖掘,在知道設置時使用'tm_isdst = 0或1',否則使用'-1'。 – chux 2014-11-06 21:26:47