1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[C++] 日付時刻とタイムゾーンの取得の仕方

Last updated at Posted at 2020-10-08

全体もくじ
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」のままだった。
image.png
※アプリを一回落として、再度同じ処理を行うと、変更後のタイムゾーンの文字列になる様子。

アプリ起動中のままでタイムゾーン変更したときに、それを知れる方法を知りたい。

前提

下記を使用。

  • 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);

出力
image.png
→アプリを起動したままでも、タイムゾーンを変更すると、そのタイムゾーンに合わせて出力も変わる。

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);

出力
image.png
→アプリを起動したままだと、タイムゾーンを変更しても、そのタイムゾーンに合わせて出力は変わらない

参考

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

strftimeの公式
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/strftime-wcsftime-strftime-l-wcsftime-l?view=vs-2019

①のやり方を見つけるきっかけページ
http://kwikwi.cocolog-nifty.com/blog/cat13582138/index.html

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?