首页 > 解决方案 > 在 DST(夏令时)日期使用 WIN32 _mktime 时如何处理精确时间?

问题描述

假设我开发了一个在 Windows 上运行的票务应用程序。给定票的有效期为 3 小时。现在,如果我想在 2020 年 3 月 28 日(GMT+1,德国)晚上 11 点(23:00:00)打印一张票,它应该在第二天早上 2 点之前有效。(我操纵我的系统时间进行测试)

问题是,在 29 日 DST 更改发生:凌晨 2 点时间将设置为凌晨 3 点。

由于 DST,门票仅在凌晨 1 点之前有效(因此从技术上讲只有 2 小时),即使实际的时间飞跃发生在当天晚些时候。

这是我所做的:

我目前使用的时间struct tm myTime;

myTime.tm_mday;       \* = 28 *\
myTime.tm_hour;       \* = 23 *\

struct tm newTime;

newTime.tm_mday = myTime.tm_mday;       \* also done for remaining fields *\
newTime.tm_hour = myTime.tm_hour + 3;   \* = 26 *\

到目前为止没有问题。在其他任何一天,26 小时将转换为第二天凌晨 2 点。

但是如果我time_t result = _mktime64( newTime );在这种特定情况下调用,则生成的时间戳(例如 1585440205)将具有 mday = 29 和 hour = 1(转换时)

是否有另一种选择,可以精确计算时间,这样我的机票有效期不会损失一小时?(我假设 _mktime64 识别 DST 更改并操纵一天中的所有时间,无论它们是在凌晨 2 点的实际时间更改之前还是之后)

标签: c++windowsvisual-c++crt

解决方案


推荐阅读