在我的应用程序需要使用在一个文件中描述的图案来计算偏移。 最近,我的一个客户应用被吊因为以下原因:

如果您在“结构TM”与冬季(非DST)结束的确切时刻_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);

假设有从winter-到夏季时的开关在4月5日在2:00。 在实践中,这意味着我们有以下的时间的时刻:

5 April, 1:58
5 April, 1:59
5 April, 3:00

由于我不知道应用程序时DST开始或结束(我真的想知道这个?)我通过日期“4月5日,2:00”至_mktime64使用上面所示的代码。

我期望_mktime64给我的time_t值对应于4月5日,3:00(它是完全相同的时刻为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(发布候选)具有相同的行为。

在问题出现在XP和Windows7(没有检查Vista)的

这是一个已知的错误? 还是有其他的技巧来解决这个问题?

有帮助吗?

解决方案

我想这根本不知道如何正确处理您在传递无效的时间也肯定是你的时区无效 - 你想到它是“1分钟冬季1:59后”这意味着你希望它与DST恢复运行,这听起来合理回报“3:00”。然而,它同样可以把它当作“在夏季三时00分前一小时”这意味着它一定是从冬季期间,因此返回“1时00分”。因此,我不认为这是一个错误 - 它更可能是关于如何处理不存在的时间不确定的行为

我希望解决这个最安全的方法是使用UTC作为整个然后没有任何含糊之处。显然,这可能不干净地映射到你的应用领域,但这样是推动时间向前和向后的阴暗世界!

其他提示

这是与本地时间的UTC代替工作的必然结果。 DST的端部是一个谎言太,时间戳的切换,因为本地时间期间是矛盾的匹配两次。

这是很容易与UTC的工作,而不是,那是什么操作系统确实是很好的解决。检查你的CRT实现,像_gmtime64()或本机GetFileTime()。

尝试4月5日,下午2:30转换为time_t类似尝试转换29 2011年2月到time_t。在两种情况下你期待一个有效的结果,因为输入的是不是一个有效日期。 4月5日,下午2:00,甚至不存在。 1:59.59由3:00:00之后直接跟随

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top