出于我的应用程序内的迷你调度程序的目的,我需要能够在当地绝对时间安排活动。
例如,我可能希望在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小时。
因此,假设计时器有任意绝对时间,您如何考虑夏令时调整?
答案 0 :(得分:0)
您不必将代码更改为夏令时调整因素,TzSpecificLocalTimeToSystemTime API已经为您执行此操作。
请注意,对于将来的时间戳,Windows对于DST-> STD(反之亦然)转换的数据可能不准确。政府可能会选择在将来使用不同的时刻。此外,有时政府可能会选择使用完全不同的时区,这已经发生了!对于过去的时间戳,你可能会得到很好的结果,但你永远不会知道Windows'数据库是。
因此,您不必更改代码,但请注意您仍可能获得不准确的结果。