SetWaitableTimer和夏令时调整
为了我的应用程序内的迷你调度程序的目的,我需要能够在某个绝对当地时间安排事件。
例如,我可能想要在November 5, 2017
年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小时。
因此,假定计时器有任意的绝对时间,您如何考虑夏令时调整?
您无需更改代码以考虑夏令时调整,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?