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_tlocaltime
: time_t → tm- (gmtime: time_t → tm、協定世界時を変換)
- 出力
- time_t用
ctime
- tm用
asctime
put_time
: <iomanip>に定義されているのでC++スタイル?だがこちらにメモ- strftime: asctimeより複雑、フォーマットいじりやすい
- wcsftime: wide characterなるものがあるらしい(省略)
- time_t用
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++スタイル
chrono::system_clock::to_time_t
: time_point→time_tchrono::system_clock::from_time_t
: time_t→time_point- tmにはtime_tを経由してlocaltimeで変換する
- CとC++でエポックが異なるのでchrono::time_point::time_since_epoch、chrono::duration::countは利用できない