SetWaitableTimer和夏令时调整

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

例如,我可能想要在November 5, 2017November 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小时。

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


您无需更改代码以考虑夏令时调整,TzSpecificLocalTimeToSystemTime API已经可以为您做到这一点。

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

所以,你不必改变你的代码,但要注意你仍然可能得到不准确的结果。

链接地址: http://www.djcxy.com/p/29397.html

上一篇: SetWaitableTimer and daylight saving adjustments

下一篇: How does Calendar.add work around Daylight Savings time?