#18 C++で学ぶ日付と時刻の扱いの基本
C++の日付操作は、標準ライブラリのchronoという仕組みを使います。この記事では、C++における日付と時刻の基本的な扱い方を、つまずきやすいポイントも含めて解説します。
chronoを使う
#include <chrono>
auto now = std::chrono::system_clock::now();
chronoは「時計」を意味する名前の通り、C++に複数用意されている時計(クロック)を扱うための仕組みです。system_clockはカレンダー時刻(実際の日時)に対応する時計で、後述する経過時間の計測には別の時計を使うのがポイントです。
経過時間を測る
C++のchronoは、日付そのものより「処理にかかった時間を測る」用途でよく使われます。
auto start = std::chrono::steady_clock::now();
// 何らかの処理
auto end = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
ここでsystem_clockではなくsteady_clockを使っている点に注目してください。system_clockはシステムの日時設定が変更されると値が飛ぶ(逆行することすらある)のに対し、steady_clockは必ず一定のペースで進み続けることが保証されています。そのため「処理時間を正確に測りたい」場合は、必ずsteady_clockを使うのがC++での定石です。
人が読める形式に変換する
system_clockで取得した時刻は、そのままでは内部表現のままで人間が読める文字列になりません。std::chrono::system_clock::to_time_t()でtime_t型に変換し、std::localtimeやstd::strftimeと組み合わせることで「2026-07-30 12:00:00」のような見慣れた形式の文字列に変換できます。この変換の手順が他の言語に比べてやや長く感じられる点も、C++の日付操作の特徴です。
C++20以降のカレンダー機能
従来のchronoは経過時間の計測が主な用途でしたが、C++20からはstd::chrono::year_month_dayのような、カレンダー形式で年月日を直接扱える型が追加されました。「今日から30日後の日付を求める」「うるう年かどうかを調べる」といったカレンダー計算をしたい場合は、こうした新しい機能や専用のライブラリ(Howard Hinnant氏のdateライブラリなど)を活用すると実装がシンプルになります。
C++ならではの注意点
C++のchronoは、他の言語の日付操作に比べると、扱いがやや複雑に感じられます。特に「経過時間の計測にはsteady_clock、実時刻の取得にはsystem_clockを使う」という時計の使い分けを意識せずに書いてしまうと、システム時刻が変更された際にタイマー処理がおかしくなるといった不具合につながることがあるため注意しましょう。
まとめ
C++の日付・時刻操作はchronoが基本で、特に処理時間の計測ではsteady_clockがよく使われます。実時刻の取得にはsystem_clock、カレンダー計算にはC++20の新機能や専用ライブラリも検討しましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
C++をもっと学びたい方には「新・明解C++入門編」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿