これは頻繁に実行されるコードであり、高速に実行する必要があるため、最速の実装について意見を求めたいと思います。注、実際には、ある程度の精度で完全なミリ秒の解像度が必要です (したがって、秒 * 1000 では十分ではありません)。このプロジェクトでは、Boost を使用しても問題ありません。
編集: ターゲット プラットフォームは x64_86 CentOS5 です。また、OS クロックに依存できることを望んでいるので、継続的に実行されていないプログラムでもこれを使用できます。
C++ には、時間を処理するための chrono ライブラリがあります。
#include <chrono>
#include <iostream>
#include <ctime>
std::chrono::system_clock::duration duration_since_midnight() {
auto now = std::chrono::system_clock::now();
time_t tnow = std::chrono::system_clock::to_time_t(now);
tm *date = std::localtime(&tnow);
date->tm_hour = 0;
date->tm_min = 0;
date->tm_sec = 0;
auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));
return now-midnight;
}
int main()
{
auto since_midnight = duration_since_midnight();
auto hours = std::chrono::duration_cast<std::chrono::hours>(since_midnight);
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(since_midnight - hours);
auto seconds = std::chrono::duration_cast<std::chrono::seconds>(since_midnight - hours - minutes);
auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(since_midnight - hours - minutes - seconds);
auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(since_midnight - hours - minutes - seconds - milliseconds);
auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(since_midnight - hours - minutes - seconds - milliseconds - microseconds);
std::cout << hours.count() << "h ";
std::cout << minutes.count() << "m ";
std::cout << seconds.count() << "s ";
std::cout << milliseconds.count() << "ms ";
std::cout << microseconds.count() << "us ";
std::cout << nanoseconds.count() << "ns\n";
}
得られる解像度が正確に何であるかは、実装によって異なります。VS 11 ベータ版では、解像度が 100ns であると主張されていますが、その精度はわかりません。
11h 51m 57s 285ms 699us 600ns
Microsoft の記事「Implement a Continuously Updating, High-Resolution Time Provider for Windows」でQueryPerformanceCounter
、高解像度の時刻を取得する方法が詳しく説明されています。
たとえば、毎秒時間を確認するタイマーを作成してみます。午前 0 時までの時間が K 秒未満の場合:
while(True)
{
if (checkTime() >= MIDNIGHT))
{
break;
}
}