在我的应用程序中,我需要使用文件中描述的模式来计算班次。最近,在我的一位客户那里,由于以下原因,该应用程序被挂起:
如果您在冬季(非 DST)结束时的确切时刻填写“struct tm”,_mktime 似乎会返回不正确的结果。
代码如下所示:
struct tm tm_start;
tm_start.tm_mday = startday;
tm_start.tm_mon = startmonth-1;
tm_start.tm_year = startyear-1900;
tm_start.tm_hour = starthour;
tm_start.tm_min = startmin;
tm_start.tm_sec = startsec;
tm_start.tm_isdst = -1; // Don't know if DST is active at this moment
_int64 contTime = _mktime64(&tm_start);
假设在 4 月 5 日 2:00 从冬季时间切换到夏季时间。在实践中,这意味着我们有以下时刻:
5 April, 1:58
5 April, 1:59
5 April, 3:00
由于我在应用程序中不知道 DST 何时开始或结束(我真的想知道这个吗?)我使用上面显示的代码将日期“4 月 5 日,2:00”传递给 _mktime64。
我希望 _mktime64 给我对应于 4 月 5 日 3:00 的 time_t 值(与 4 月 5 日 2:00 完全相同的时刻)。
然而,这不是正在发生的事情。_mktime64 将 tm_start 更改为 4 月 5 日 1:00 并返回相应的 time_t 值。这意味着我得到了一个完全不同的时刻。(实际上:2:00 到 3:00 之间的每一刻都会导致 _mktime64 返回 1:00 到 2:00 之间的一个时刻)
我认为这是 Visual Studio 2005 中的错误,但显然 Visual Studio 2010 (Release Candidate) 具有相同的行为。
该问题出现在 XP 和 Windows7 上(未检查 Vista)。
这是一个已知的错误?或者还有其他解决这个问题的技巧吗?