Time_pointがhigh_resolution_clockから取得されたときにtime_pointを出力するにはどうすればよいですか?
timestamp = std::chrono::high_resolution_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(timestamp);
std::cout << std::ctime(&now) << std::endl;
コンパイル時に次のエラーメッセージが表示されます。
error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>'
time_t tt = std::chrono::system_clock::to_time_t(timestamp);
これを行うための本当に優雅な方法はありません。 high_resolution_clock
は、UTCまたはその他のカレンダーに関連していることがわかっていません。移植可能にできることの1つは、指定されていないエポックから現在の期間を、その期間の単位とともに出力することです。
#include <chrono>
#include <iostream>
int
main()
{
using Clock = std::chrono::high_resolution_clock;
constexpr auto num = Clock::period::num;
constexpr auto den = Clock::period::den;
std::cout << Clock::now().time_since_Epoch().count()
<< " [" << num << '/' << den << "] units since Epoch\n";
}
私にとってどれが出力しますか:
516583779589531 [1/1000000000] units since Epoch
これは、私のマシンでこの時計のエポックから516583779589531ナノ秒(または516,583.779589531秒)であることを意味します。私のマシンでは、これは次のように解釈されます。私のマシンはほぼ6日間起動されています。しかし、その翻訳は移植性がありません。
ああ!そして、エラーメッセージから libc ++ を使用していることに注意してください。 OS Xも使用している場合、high_resolution_clock
の定義は同じです。コンピュータが起動してからナノ秒をカウントします。
少なくとも私が物事を読んでいるとき、その意図はstd::high_resolution_clock
は、CPUのタイムスタンプカウンターのようなもののラッパーとして定義できます。これは、CPUクロックサイクルごとにインクリメントされる単なるレジスタです。
これは必ずしも当てはまるわけではありませんが(現在のシステムではCPUクロック周波数を絶えず変更しているため、おそらくお勧めできません)、他の同様のクロックもサポートすることを目的としています。
結論:絶対時間と高解像度時計の間に既知の関係がない可能性があるため、実際には、絶対時間ではなく、期間のみを生成するように定義されています。