私のアプリ内のミニスケジューラの目的のために、あるローカルタイムでイベントをスケジュールする必要があります。SetWaitableTimerと夏時間の調整
たとえば、私は7 AM
のNovember 5, 2017
にスケジュールすることができます。米国に住んでいる誰もが知っているように、それは夏時間が2 AM
で終わる夜です。 SetWaitableTimer
APIはUTC
形式で時間がかかるので、DSTが始まる前に
//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);
は、上記の方法が原因で行わローカルからUTC変換の1時間でオフになります。
は、だから私は、次のメソッドを使用します11月5日に
したがって、タイマーの任意の絶対時間を仮定すると、夏時間調整をどのように考慮しますか?
TzSpecificLocalTimeToSystemTime APIのmsdnの注釈セクションでは、_TzSpecificLocalTimeToSystemTimeは、変換されるローカル時間に対して夏時間(DST)が有効かどうかを考慮しています._最初の引数はNULLを意味します。lpTimeZoneInformationがNULLの場合、関数現在アクティブなタイムゾーンを使用します._システムが希望する現地時間でDSTオフセットに関する情報を持っている場合は、それを考慮に入れます。あなたは何の結果を期待していますか、実際に何を得ますか? –
@ R.Beiboer: 'TzSpecificLocalTimeToSystemTime' APIを呼び出すときのDSTオフセットを考慮に入れます。したがって、たとえば、私が今呼び出すと、DSTの調整は「UTC-08:00」になります。これは2017年11月5日に「UTC-07:00」に変更され、今度は私のタイマーを1時間捨ててしまいます。 – c00000fd
現在のタイムゾーン名は何ですか? 2017年11月5日に地方の午前7時にどのようなUTCタイムを取得しますか。あなたが持っている実際のデータで動作を確認する方が簡単です。 –