SetWaitableTimer和夏令时调整

时间:2017-03-29 06:50:02

标签: c++ winapi timer dst

出于我的应用程序内的迷你调度程序的目的,我需要能够在当地绝对时间安排活动。

例如,我可能希望在7 AM上安排November 5, 2017。任何生活在美国的人都知道,那就是夏令时在2 AM结束的那个夜晚。

所以我使用以下方法:

//ERROR CHECKS ARE OMITTED FOR BREVITY
HANDLE hTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);

//Nov 5, 2017 at 7:00 AM
SYSTEMTIME stLocal = {2017, 11, 0, 5, 7, 0, 0, 0};
SYSTEMTIME stUTC = {0};
::TzSpecificLocalTimeToSystemTime(NULL, &stLocal, &stUTC);

FILETIME ftUTC = {0};
::SystemTimeToFileTime(&stUTC, &ftUTC);

//Set timer
::SetWaitableTimer(hTimer, (LARGE_INTEGER*)&ftUTC, 0, NULL, NULL, FALSE);

//Wait for it
::WaitForSingleObject(hTimer, INFINITE);

::CloseHandle(hTimer);

由于SetWaitableTimer API需要UTC格式的时间,因此在11月5日夏令时开始之前完成本地到UTC的转换,上述方法将关闭1小时。

因此,假设计时器有任意绝对时间,您如何考虑夏令时调整?

1 个答案:

答案 0 :(得分:0)

您不必将代码更改为夏令时调整因素,TzSpecificLocalTimeToSystemTime API已经为您执行此操作。

请注意,对于将来的时间戳,Windows对于DST-> STD(反之亦然)转换的数据可能不准确。政府可能会选择在将来使用不同的时刻。此外,有时政府可能会选择使用完全不同的时区,这已经发生了!对于过去的时间戳,你可能会得到很好的结果,但你永远不会知道Windows'数据库是。

因此,您不必更改代码,但请注意您仍可能获得不准确的结果。