首页 文章

SetWaitableTimer和夏令时调整

提问于
浏览
0

为了在我的应用程序中使用迷你调度程序,我需要能够在某个绝对的当地时间安排一个事件 .

例如,我可能想在 November 5, 2017 上安排 7 AM . 任何生活在美国的人都可能知道,那就是夏令时结束的那个夜晚 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日DST开始之前完成本地到UTC的转换,上述方法将关闭1小时 .

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

1 回答

  • 0

    您无需更改代码以考虑夏令时调整,TzSpecificLocalTimeToSystemTime API已经为您执行此操作 .

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

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

相关问题