tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

C++での時間の取り扱い

C++で日時を取り扱うプログラムを書いている。Cスタイル、C++スタイルの両方が存在しているほか、相互に変換するための関数、計測精度ごとに複数の関数が存在するなど非常にややこしい。以下は簡単なまとめとして、具体的にインクルードすべきヘッダ、型に関する情報はレファレンスをその都度参照して確認する。

1. Cスタイル

  • tm: カレンダーを表す構造体
  • time_t: エポック(1900年1月1日)からの秒数
  • timespec: ナノ秒精度でカレンダーを表す構造体
  • clock_t: プロセスの占有時間を測定するための型

関数

  • 時間取得
    • time: time_tを書き換えて現在時刻に相当するtime_tを返す。実際にはtime(nullptr)として使うことが多い
    • clock: プロセッサ時間
    • timespce_get: timespec構造体を現在時刻に合わせる
  • 時間差
    • difftime: double(time_t, time_t)
  • 相互の変換
    • mktime: tm → time_t
    • localtime: time_t → tm
  • 出力
    • time_t用
      • ctime
    • tm用
      • asctime
      • put_time: <iomanip>に定義されているのでC++スタイル?だがこちらにメモ
      • strftime: asctimeより複雑、フォーマットいじりやすい
      • wcsftime: wide characterなるものがあるらしい(省略)

2. C++スタイル

  • chrono::duration: 時間間隔を表すクラス。duration<type, std::ratio<n,m>>、ratioで時間の刻み幅を決めてtypeで保存
  • chrono::time_point: エポック(1900年1月1日とは限らない!!)からの時間経過を表すクラス。time_point<clock>と定義されているので違う時計の値同士の演算は出来ない
  • chrono::system_clock: 時計
  • chrono::steady_clock: ストップウォッチ
  • chrono::high_resolution_clock: 高精度な時計

関数

  • 時間取得
    • chrono::system_clock::now: time_pointを返す
  • 時間差
    • chrono::duration_cast: duration_cast<Duration>(t1-t0)
  • 単位変換
    • 精度が落ちない場合(sec→msec): implicit cast可(static_castも可)
    • 精度が落ちる場合(msec→sec)
      • chrono::time_point_cast<chrono::time_point<Clock, Duration>>
  • 出力
    • 数えるだけ
      • chrono::time_point::time_since_epoch: durationを返す。
      • chrono::duration::count
    • 年/月/日のようにフォーマットを整えるには一度cスタイルに変換するらしい
      • now_c = to_time_t(time_point)
      • put_time(localtime(&now_c))

3. Cスタイル ↔ C++スタイル