2017-03-29 21 views
0

私のアプリ内のミニスケジューラの目的のために、あるローカルタイムでイベントをスケジュールする必要があります。SetWaitableTimerと夏時間の調整

たとえば、私は7 AMNovember 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日に

したがって、タイマーの任意の絶対時間を仮定すると、夏時間調整をどのように考慮しますか?

+0

TzSpecificLocalTimeToSystemTime APIのmsdnの注釈セクションでは、_TzSpecificLocalTimeToSystemTimeは、変換されるローカル時間に対して夏時間(DST)が有効かどうかを考慮しています._最初の引数はNULLを意味します。lpTimeZoneInformationがNULLの場合、関数現在アクティブなタイムゾーンを使用します._システムが希望する現地時間でDSTオフセットに関する情報を持っている場合は、それを考慮に入れます。あなたは何の結果を期待していますか、実際に何を得ますか? –

+0

@ R.Beiboer: 'TzSpecificLocalTimeToSystemTime' APIを呼び出すときのDSTオフセットを考慮に入れます。したがって、たとえば、私が今呼び出すと、DSTの調整は「UTC-08:00」になります。これは2017年11月5日に「UTC-07:00」に変更され、今度は私のタイマーを1時間捨ててしまいます。 – c00000fd

+0

現在のタイムゾーン名は何ですか? 2017年11月5日に地方の午前7時にどのようなUTCタイムを取得しますか。あなたが持っている実際のデータで動作を確認する方が簡単です。 –

答えて

0

夏時間調整の際にコードを変更する必要はありません。TzSpecificLocalTimeToSystemTime APIは既にそれを行います。

将来のタイムスタンプのために、DST-> STD(およびその逆)の遷移に関するWindowsのデータは不正確かもしれないことに注意してください。政府は将来的にそれとは異なる瞬間を使うことを選ぶかもしれない。また、時には政府が時間帯全体を使用することを選択することもあります。過去のタイムスタンプでは、良い結果が得られるはずですが、Windowsのデータベースがどれだけ完全であるかはわかりません。

コードを変更する必要はありませんが、不正確な結果が得られる可能性があることに注意してください。

+0

DST調整が行われた日にスケジュールがXPマシンから1時間遅れていると私のソフトウェアのユーザーから報告がありました。どのように説明しますか? – c00000fd

+0

おそらくそのXPマシンは特定の時間のDST/STD情報に関する情報が不足していますか?ユーザーが使用している時間帯についての情報はありませんか? –

+0

それは一度だけ起こったのですか? UTC時間が存在しない時間 "limbo hour"。標準時間が始まると、2時間のUTC時間があります。これらの時間のいずれかに設定されている可能性がありますか? –