设置可等待计时器和夏令时调整



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

例如,我可能想将其安排在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形式需要时间,因此上述方法将偏差 1 小时,因为在 11 月 5 日夏令时开始之前完成本地到 UTC 的转换。

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

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

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

因此,您

不必更改代码,但请注意,您仍然可能会得到不准确的结果。

最新更新