私の C++ プロジェクトには、Linux のシステム関数を使用して時間に関する計算を行う非常に古い関数があります。
コードの picec は次のとおりです。
struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t seqId = (tv.tv_sec % 86400)*10000 + tv.tv_usec / 100;
* 10000
/ 100
このコードは seqId を生成しようとしているためです。
今、私はstd::chrono
それを置き換えるために C++11 を使用しようとしています。これが私のコードです:
std::chrono::high_resolution_clock::duration duration_since_midnight() {
auto now = std::chrono::high_resolution_clock::now();
std::time_t tnow = std::chrono::high_resolution_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;
}
auto res = duration_since_midnight();
auto sec = std::chrono::duration_cast<std::chrono::seconds>(res);
auto mil = std::chrono::duration_cast<std::chrono::milliseconds>(res - sec);
std::cout << sec.count() * 10000 + mil.count() << std::endl;
ただし、結果は常に間違っています。たとえば、古いバージョンでは が表示される場合があります360681491
が、私のバージョンでは360680149
. まったく同じではないことがわかります。
どうしてか分かりません。それとも、そうすることができませんstd::chrono
か?