4

我在一个旧的 C++ MFC 程序中发现了一个错误,该程序计算给定日期与固定基准日期的偏移量(以天为单位)。由于某种原因,我们看到结果偏离了一个,我将其追踪到原始程序员使用 CTimeSpan.GetDays() 方法的位置。根据文档

请注意,夏令时可能会导致 GetDays 返回一个可能令人惊讶的结果。例如,当 DST 生效时,GetDays 将 4 月 1 日和 5 月 1 日之间的天数报告为 29,而不是 30,因为 4 月的一天缩短了一个小时,因此不算完整的一天。

我建议的解决方法是(obj.GetTotalHours()+1)/24改用。我认为这将涵盖所有问题,因为这是每天大约在同一时间运行的批处理作业,但我想在实施它之前我会问这里的聪明人是否有更好的方法。

这只是一个附带问题,但我也很好奇如果程序可以随时运行,将如何处理。

4

2 回答 2

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;
于 2008-10-28T16:01:03.893 回答
0

对 Mark 建议的内容进行了微小的更改,它无需任何舍入即可工作:只需向构造函数添加一个零参数即可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();

测试和工作。

于 2013-05-01T15:02:56.873 回答