記事検索

検索ワードを入力してください。
Sky Tech Blog
std::chrono を​使った​ フォーマット

std::chrono を​使った​ フォーマット

C++で現在日時を取得しフォーマットする方法について説明しています。GetLocalTime()と、STLのstd::chronoライブラリの違いや利点、注意点などを解説します。

C++でWindowsのプログラムを作っている場合、現在日時の文字列はGetLocalTime()を使って得られますが、

    SYSTEMTIME st = { 0 };
    ::GetLocalTime(&st);
    auto now = std::format(L"{:04}/{:02}/{:02} {:02}:{:02}:{:02}.{:03}",
        st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
---
now : 2025/10/14 09:27:42.879

STLのstd::chronoというライブラリを使えば、以下のように簡単な記載で得られます。

    auto now = std::format(L"{}", std::chrono::system_clock::now());
---
now : 2025-10-14 00:27:42.8796568

これだとUTCの表記になるので、ローカル日時を得たい場合は以下のようにします。

    auto now = std::format(L"{}", std::chrono::zoned_time(std::chrono::current_zone(), std::chrono::system_clock::now()));
---
now : 2025-10-14 09:27:42.8796568 JST

ミリ秒単位にしたい場合は、

    auto now = std::format(L"{}", std::chrono::zoned_time(std::chrono::current_zone(), std::chrono::time_point_cast(std::chrono::system_clock::now())));
---
now : 2025-10-14 09:27:42.879 JST

フォーマットフラグを使えば、好きな形式にできます。

    auto now = std::format(L"{:%Y/%m/%d %H:%M:%S}", std::chrono::zoned_time(std::chrono::current_zone(), std::chrono::time_point_cast(std::chrono::system_clock::now())));
---
now : 2025/10/14 09:27:42.879

注意点

std::chronoを使えばOSに依存しない形式で記載できるのですが、ローカル日時を得る際に使うstd::chrono::current_zone()は、

Windows 10 バージョン 1903/19H1以降、およびWindows Server 2022以降

でしか使えないようですので、少し前のOSで実行するプログラムの場合は上記の方法が使えません。(参考:zoned_time クラス ー 要求事項)

代わりにtime_tを経由する以下の方法があります。

    auto sys_now = std::chrono::system_clock::now();
    std::time_t now_t = std::chrono::system_clock::to_time_t(sys_now);
    std::tm lt = { 0 };
    localtime_s(&lt, &now_t);
    auto now = std::format(L"{:04}/{:02}/{:02} {:02}:{:%M:%S}", lt.tm_year + 1900, lt.tm_mon + 1, lt.tm_mday, lt.tm_hour, std::chrono::time_point_cast(sys_now));
---
now : 2025/10/14 09:27:42.879

速度に​ついて

最後に、GetLocalTime()で得る方法と、std::chronoで得る方法の速度を比較してみました。
それぞれ10万回実行すると、

  • GetLocalTime()は0.038(秒)
  • std::chronoは1.145(秒)

といった結果で、std::chronoのほうが約30倍遅いようです。

思っていたより違いが出たので、繰り返し実行する場合は注意しておいたほうがよさそうです。


\シェアをお願いします!/
  • X
  • Facebook
  • LINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム