在我的C 專案中,有一個很老的函式,就是利用Linux的系統函式來做一些時間的計算。
這是一段代碼:
struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t seqId = (tv.tv_sec % 86400)*10000 tv.tv_usec / 100;
* 10000并且/ 100沒有錯,因為這段代碼即將生成一個seqId。
現在,我正在嘗試使用std::chronoC 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?
uj5u.com熱心網友回復:
您不必堅持使用庫提供的持續時間型別。您可以定義自己的具有您需要的表示形式:
using tenthmillis = duration<long, ratio<1,10000>>;
然后您可以進行以下計算。
auto now = high_resolution_clock::now().time_since_epoch();
auto oneDay = duration_cast<tenthmillis>(days{1});
auto sinceMidnight = duration_cast<tenthmillis>(now) % oneDay.count();
cout << sinceMidnight.count();
注意:根據需要自行添加命名空間限定。
[更新:代替high_resolution_clock,選擇gettimeofday在其實作中使用的時鐘以獲得與您的gettimeofday實作相當的結果。]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364332.html
