全体もくじ
⇒https://qiita.com/tera1707/items/4fda73d86eded283ec4f
やりたいこと
C++アプリ起動中に、タイムゾーンをWindowsの設定画面から変えたら〇〇をする、みたいな処理を作るために、localtime_s()
を使って、
localtime_s(&tmv, &t);
wcsftime(wstr, sizeof(wstr)/sizeof(WCHAR), L"%z", &tmv);//→「+0900」のような文字列を出力
で採れる文字列が、タイムゾーンの変更時に変わったら〇〇する、という作りにしようとしたが、それだとタイムゾーンの設定を変えても出力文字列が変更についてこなかった。
例えば、「(UTC+09:00)大阪、札幌、東京」の時には、上のコードで「+0900」と取れていて、タイムゾーンを「(UTC+10:00)ウラジオストク」に変更して同じ処理を行うと、「+1000」を期待するが、そうはならず、「+0900」のままだった。
※アプリを一回落として、再度同じ処理を行うと、変更後のタイムゾーンの文字列になる様子。
アプリ起動中のままでタイムゾーン変更したときに、それを知れる方法を知りたい。
前提
下記を使用。
- VisualStudio2019
- ISO C++17 標準 (std:c++17)
やり方
結果として、下に挙げた「UTCからローカル時間を取得①(タイムゾーン変化を検出可能)」のやり方で、変化を検出できた。
一応、その前にやっていたやり方も「UTCからローカル時間を取得②(タイムゾーン変化を検出できない)」で挙げておく。
UTCからローカル時間を取得①(タイムゾーン変化を検出可能)
この処理を実装したアプリ(プロセス)が起動中に、タイムゾーンの変更をしても
値が追従する。
// UTC時間取得用
SYSTEMTIME stutc;
// ローカル時間取得用
SYSTEMTIME stlocal;
// 現在のWindowsのタイムゾーン情報を取得
TIME_ZONE_INFORMATION tzi;
GetTimeZoneInformation(&tzi);
// UTC時間を取得
GetSystemTime(&stutc);
// UTC時間をWindowsのタイムゾーン設定に合った現地のローカル時間に変換
SystemTimeToTzSpecificLocalTime(&tzi, &stutc, &stlocal);
// UTCからの差(分単位)を取得し符号反転
int wBias = -(tzi.Bias);
int wBiasHour = wBias / 60;
int wBiasMin = wBias % 60;
printf("%04d/%02d/%02d %02d:%02d:%02d%+03d:%02d\n", stlocal.wYear, stlocal.wMonth, stlocal.wDay, stlocal.wHour, stlocal.wMinute, stlocal.wSecond, wBiasHour, wBiasMin);
出力
→アプリを起動したままでも、タイムゾーンを変更すると、そのタイムゾーンに合わせて出力も変わる。
UTCからローカル時間を取得②(タイムゾーン変化を検出できない)
この処理を実装したアプリ(プロセス)が起動中に、タイムゾーンの変更すると、値がついてこない。(変更前の時刻のままになる)
auto t3 = time(nullptr);
auto tmv3 = tm();
//auto error3 = gmtime_s(&tmv3, &t3); // UTC時間を取得
auto error3 = localtime_s(&tmv3, &t3); // ローカル時間(タイムゾーンに合わせた時間)を取得
char buf[256] = { 0 };
strftime(buf, 256, "%Y/%m/%d %H:%M:%S%z\n", &tmv3); \\ tmを文字列に変換
printf(buf);
出力
→アプリを起動したままだと、タイムゾーンを変更しても、そのタイムゾーンに合わせて出力は変わらない。
参考
GetTimeZoneInformationの公式
https://docs.microsoft.com/ja-jp/windows/win32/api/timezoneapi/nf-timezoneapi-gettimezoneinformation
GetSystemTimeの公式
https://docs.microsoft.com/ja-jp/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtime
SystemTimeToTzSpecificLocalTimeの公式
https://docs.microsoft.com/ja-jp/windows/win32/api/timezoneapi/nf-timezoneapi-systemtimetotzspecificlocaltime
localtime_sの公式
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/localtime-s-localtime32-s-localtime64-s?view=vs-2019
①のやり方を見つけるきっかけページ
http://kwikwi.cocolog-nifty.com/blog/cat13582138/index.html