[C++] 날짜 및 시간대를 가져오는 방법

전체 추첨
https://qiita.com/tera1707/items/4fda73d86eded283ec4f
하고 싶은 일
C++ 응용 프로그램 시작 중 윈도 설정 화면에서 시간대를 변경하기 위해 사용합니다localtime_s()
    localtime_s(&tmv, &t);
    wcsftime(wstr, sizeof(wstr)/sizeof(WCHAR), L"%z", &tmv);//→「+0900」のような文字列を出力
에 사용되는 문자열은 시간대를 변경할 때 00으로 변경됩니다. 그러면 시간대 설정이 변경되어도 출력 문자열은 변경되지 않습니다.
예를 들어'(UTC+09:00) 오사카, 삿포로, 도쿄'때 위 코드가'+0900'이었는데 시간대를'(UTC+10:00) 블라디보스토크'로 바꿔 똑같이 처리해'+1000'을 기대했지만 그렇지 않아'+090'을 유지했다.

※ 앱이 한 번 떨어져서 다시 같은 처리를 하면 변경된 시간대 문자열로 변경됩니다.
프로그램 시작 중 시간대를 변경할 때 그 방법을 알고 싶습니다.
전제 조건
다음을 사용합니다.
  • VisualStudio2019
  • ISOC+++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);
    
    출력

    → 프로그램이 아직 시작되지 않았다면, 시간대를 바꿔도 출력은 시간대에 따라 바뀌지 않습니다.
    참고 자료
    GetTimeZone Information 공식
    https://docs.microsoft.com/ja-jp/windows/win32/api/timezoneapi/nf-timezoneapi-gettimezoneinformation
    GetSystem Time의 공식
    https://docs.microsoft.com/ja-jp/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtime
    Sys t e m TimeTozSpecificLocal Time 공식 웹 사이트
    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
    공식 사이트
    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

    좋은 웹페이지 즐겨찾기