C++ でミリ秒単位で時間を取得する方法
-
C++ でミリ秒単位の時刻を取得するには
std::chrono::system_clock::now()
メソッドを用いる -
C++ で時刻をミリ秒単位で取得するには
gettimeofday()
関数を使用する -
C++ で時間をミリ秒単位で取得するには
time()
関数を使用する
この記事では、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
関数を呼び出すことです。time
は time_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