C++の基礎 - 時刻

提供: MochiuWiki : SUSE, EC, PCB

2022年5月10日 (火) 16:21時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == 今日の経過時刻(mS)を取得する == 今日の0時0分0秒000からの経過時刻(mS)を求めるには、C++11で追加された<code>std::chrono</code>を使用する。<br> なお、C++17やLinuxでは、別の方法もある。<br> <br> 現在時刻に関する情報は、<code>std::chrono</code>の<code>now</code>メソッドで取得できる。<br> なお、この時刻はUTC(協定世界時)であり日本時間とは異な…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要



今日の経過時刻(mS)を取得する

今日の0時0分0秒000からの経過時刻(mS)を求めるには、C++11で追加されたstd::chronoを使用する。
なお、C++17やLinuxでは、別の方法もある。

現在時刻に関する情報は、std::chrononowメソッドで取得できる。
なお、この時刻はUTC(協定世界時)であり日本時間とは異なることに注意する。

 #include <chrono>
 
 std::chrono::system_clock::time_point tp = std::chrono::system_clock::now();


まず、time_since_epocメソッドを使用して、エポックからの経過時刻を取得した後、countメソッドでミリ秒を取得する。
取得した値から現在時刻のミリ秒の部分を得る。
エポックの時刻は未規定ではあるが、概ね1970年1月1日で経過時刻(mS)は1兆を超える値になるため、32ビットのint型では格納できないことに注意する。

 // エポックからの経過時刻
 std::chrono::milliseconds tp_msec = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
 
 // 経過時刻を総ミリ秒(整数値)に変換する
 long long all_msec = tp_msec.count();
 
 // 1秒未満の値を取り出す
 int msec = all_msec % 1000;


時間、分、秒を取得するため、time_t型に変換する。
さらに、現地時間(日本時間)に変換する。

 time_t time = std::chrono::system_clock::to_time_t(tp);
 struct tm* t = localtime(&time);


この時、今日の経過時刻(mS)は計算できるが、time_point型は減算ができるため、今日の0時0分0秒000のtime_stampを求める。

 // 本日0時0分0秒000のtime_pointを求める
 std::chrono::system_clock::time_point day_tp = tp;
 
 // 0時にする
 day_tp -= std::chrono::hours(t->tm_hour);
 
 // 0分にする
 day_tp -= std::chrono::minutes(t->tm_min);
 
 // 0秒にする
 day_tp -= std::chrono::seconds(t->tm_sec);
 
 // コンマ0秒にする
 day_tp -= std::chrono::milliseconds(msec);


time_point型同士で減算した後、今日の経過時刻(mS)を求める。

 std::chrono::milliseconds tp_msec_today = std::chrono::duration_cast<std::chrono::milliseconds>(tp - day_tp);
 int msec_today = tp_msec_today.count();


以下の例では、上記のサンプルコードをまとめて記述している。

 #include <chrono>
 
 // 現在時刻を取得
 std::chrono::system_clock::time_point tp = system_clock::now();
 
 // 現在時刻のミリ秒の部分を取得
 auto msec = duration_cast<milliseconds>(tp.time_since_epoch()).count() % 1000;
 
 // 時間、分、秒を得るためtime_t型に変換
 time_t time = std::chrono::system_clock::to_time_t(tp);
 struct tm* t = localtime( &time );
 
 // 今日の00:00:00:000のtime_pointを計算
 std::chrono::system_clock::time_point day_start = tp - hours(t->tm_hour) - minutes(t->tm_min) - seconds(t->tm_sec) - milliseconds(msec);
 
 // 今日の開始時刻からの経過時刻(mS)を得る
 auto msec_tody = duration_cast<milliseconds>(tp - day_start).count();


C++20では、std::chrono::monthstd::chrono::yearが追加されるため、月初めからや年頭からの経過時刻(mS)を取得することができる。
また、C++20では、現地時刻用のtime_point型、今日の時間情報を取得するtime_of_dayクラスも追加されるため、time_t型に変換せずに簡単に取得できる。