2008-10-28 222 views
3

我發現一箇舊的C++ MFC程序中的一個錯誤,我們計算了一個固定基準日期的給定日期的偏移量(以天爲單位)。我們看到由於某種原因而被關閉的結果,並將其追蹤到原程序員使用CTimeSpan.GetDays()方法的地方。根據documentationCTimeSpan.GetDays()和夏令時

請注意,夏令時可能導致GetDays返回一個潛在令人驚訝的結果。例如,當DST生效時,GetDays將4月1日至5月1日之間的天數報告爲29日而非30日,因爲4月份的某一天縮短了一個小時,因此不會算作一整天。

我建議的修復方法是用(obj.GetTotalHours()+1)/24代替。我認爲這將涵蓋所有問題,因爲這是一項大約每天在同一時間運行的批處理作業,但我認爲如果可能有更好的方法,我會在實施之前向這些聰明的人詢問。

這只是一個側面問題,但我也很好奇,如果程序可以在任何時候運行,這將如何處理。

回答

2

您的修補程序可以正常工作以獲得兩次之間的整個24小時時間段的數量 - 只要事件在每天的同一時間發生即可。否則,表達式中的「+1」可能會導致錯誤。

有時你不在乎事件發生的時間,你只是想知道哪一天。在這種情況下,你需要零出時,分,秒,然後用你的公式:

CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0); 
CTime finishDay(finish.GetYear(), finish.GetMonth(), finish.GetDay(), 0, 0, 0); 
int days = ((finishDay - startDay).GetTotalHours() + 1)/24; 
+0

這是有道理的:0時間部分,然後整數除法將處理額外的小時,當夏時制改變 – 2008-10-28 19:36:10

0

什麼馬克建議和它的作品沒有舍入任何依賴一個小的改動:只需加一個參數零到CTime構造函數。這迫使兩個時間都處於標準時間(而不是夏令時)。該參數的默認值爲-1,表示「如果夏時制有效,則自動計算」。

// Discard hours, minutes, seconds, and daylight savings time 
CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0, 0); 
CTime endDay(end.GetYear(), end.GetMonth(), end.GetDay(), 0, 0, 0, 0); 

// Get number of days apart 
CTimeSpan span = endDay - startDay; 
int nDays = span.GetDays(); 

測試和工作。