MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C++の基礎 - 時刻のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C++の基礎 - 時刻
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == <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(協定世界時)であり日本時間とは異なることに注意する。<br> <syntaxhighlight lang="c++"> #include <chrono> std::chrono::system_clock::time_point tp = std::chrono::system_clock::now(); </syntaxhighlight> <br> まず、<code>time_since_epoc</code>メソッドを使用して、エポックからの経過時刻を取得した後、<code>count</code>メソッドでミリ秒を取得する。<br> 取得した値から現在時刻のミリ秒の部分を得る。<br> エポックの時刻は未規定ではあるが、概ね1970年1月1日で経過時刻(mS)は1兆を超える値になるため、32ビットのint型では格納できないことに注意する。<br> <syntaxhighlight lang="c++"> // エポックからの経過時刻 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; </syntaxhighlight> <br> 時間、分、秒を取得するため、<code>time_t</code>型に変換する。<br> さらに、現地時間(日本時間)に変換する。<br> <syntaxhighlight lang="c++"> time_t time = std::chrono::system_clock::to_time_t(tp); struct tm* t = localtime(&time); </syntaxhighlight> <br> この時、今日の経過時刻(mS)は計算できるが、time_point型は減算ができるため、今日の0時0分0秒000のtime_stampを求める。<br> <syntaxhighlight lang="c++"> // 本日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); </syntaxhighlight> <br> <code>time_point</code>型同士で減算した後、今日の経過時刻(mS)を求める。<br> <syntaxhighlight lang="c++"> std::chrono::milliseconds tp_msec_today = std::chrono::duration_cast<std::chrono::milliseconds>(tp - day_tp); int msec_today = tp_msec_today.count(); </syntaxhighlight> <br> 以下の例では、上記のサンプルコードをまとめて記述している。<br> <syntaxhighlight lang="c++"> #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(); </syntaxhighlight> <br> C++20では、<code>std::chrono::month</code>や<code>std::chrono::year</code>が追加されるため、月初めからや年頭からの経過時刻(mS)を取得することができる。<br> また、C++20では、現地時刻用の<code>time_point</code>型、今日の時間情報を取得する<code>time_of_day</code>クラスも追加されるため、<code>time_t</code>型に変換せずに簡単に取得できる。<br> <br><br> __FORCETOC__ [[カテゴリ:C++]]
C++の基礎 - 時刻
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse