2008-10-28 217 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(); 

测试和工作。