C++ でミリ秒単位で時間を取得する方法

胡金庫 2023年10月12日
  1. C++ でミリ秒単位の時刻を取得するには std::chrono::system_clock::now() メソッドを用いる
  2. C++ で時刻をミリ秒単位で取得するには gettimeofday() 関数を使用する
  3. C++ で時間をミリ秒単位で取得するには time() 関数を使用する
C++ でミリ秒単位で時間を取得する方法

この記事では、C++ でミリ秒単位で時刻を取得する方法について、複数のメソッドを紹介します。

C++ でミリ秒単位の時刻を取得するには std::chrono::system_clock::now() メソッドを用いる

std::chrono::system_clock クラスは、システム全体のリアルタイム実時間時計を取得するための C++ のインターフェイスです。ほとんどのシステムでは Unix の時刻を使用していますが、これは 1970 年 1 月 1 日の 00:00:00:00 UTC (UTC) (任意の日付) からの経過秒数で表現され、Unix のエポックと呼ばれています。うるう秒は無視されることに注意してください。このように、Unix の時間は UTC の正確な表現ではありません。

まず、現在の時刻を返すために now() メソッドが呼ばれる。次に呼ばれるメソッドは time_since_epoch で、*this から時計のエポックまでの時間を取得しますが、これは std::chrono::duration クラスのオブジェクトを返します。このオブジェクトは count メソッドを呼び出して実際のティック数を返し、それをミリ秒で表現しなければなりません。結果は duration_cast<milliseconds> を用いてキャストされます。

#include <sys/time.h>

#include <chrono>
#include <ctime>
#include <iostream>

using std::cout;
using std::endl;
using std::chrono::duration_cast;
using std::chrono::milliseconds;
using std::chrono::seconds;
using std::chrono::system_clock;

int main() {
  auto millisec_since_epoch =
      duration_cast<milliseconds>(system_clock::now().time_since_epoch())
          .count();
  auto sec_since_epoch =
      duration_cast<seconds>(system_clock::now().time_since_epoch()).count();

  cout << "seconds since epoch: " << sec_since_epoch << endl;
  cout << "milliseconds since epoch: " << millisec_since_epoch << endl;

  return EXIT_SUCCESS;
}

出力:

seconds since epoch: 1603612778
milliseconds since epoch: 1603612778389

C++ で時刻をミリ秒単位で取得するには gettimeofday() 関数を使用する

gettimeofday はシステムクロックを取得する POSIX 準拠の関数です。第一引数に struct timeval オブジェクトのアドレスを取り、時刻の値を格納します。値は tv_sec で秒数を、tv_usec で Unix のエポックからの経過時間をマイクロ秒で表します。gettimeofday はエラー処理機能を提供するため、成功すれば int 値 0 を返し、失敗すれば -1 を返します。この関数の第 2 引数は struct timezone であるが、これは減価償却されているので、単に nullptr を渡すべきです。関数の定義には <sys/time.h> ヘッダを含める必要があることに注意してください。

#include <sys/time.h>

#include <chrono>
#include <ctime>
#include <iostream>

using std::cout;
using std::endl;

int main() {
  struct timeval time_now {};
  gettimeofday(&time_now, nullptr);
  time_t msecs_time = (time_now.tv_sec * 1000) + (time_now.tv_usec / 1000);

  cout << "seconds since epoch: " << time_now.tv_sec << endl;
  cout << "milliseconds since epoch: " << msecs_time << endl << endl;

  return EXIT_SUCCESS;
}

出力:

seconds since epoch: 1603612778
milliseconds since epoch: 1603612778389

C++ で時間をミリ秒単位で取得するには time() 関数を使用する

C++ でシステム時刻を取得するもう一つの POSIX 準拠の方法は、time 関数を呼び出すことです。timetime_t* 型のオプションの引数を取り、返された時刻の値が格納されます。あるいは、関数の戻り値を用いて別途宣言された変数に格納することもできます。後者の場合、引数に nullptr を渡すことができます。この呼び出しは、前の呼び出しと同じ精度で時刻を返さないことに注意してください。

#include <sys/time.h>

#include <chrono>
#include <ctime>
#include <iostream>

using std::cout;
using std::endl;

int main() {
  time_t now = time(nullptr);
  time_t mnow = now * 1000;

  cout << "seconds since epoch: " << now << endl;
  cout << "milliseconds since epoch: " << mnow << endl << endl;

  return EXIT_SUCCESS;
}

出力:

seconds since epoch: 1603612778
milliseconds since epoch: 1603612778000
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Time