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(<, &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倍遅いようです。
思っていたより違いが出たので、繰り返し実行する場合は注意しておいたほうがよさそうです。

