【发布时间】:2021-11-19 10:04:12
【问题描述】:
在我的C++项目中,有一个很老的函数,利用Linux的系统函数来做一些时间的计算。
这是一段代码:
struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t seqId = (tv.tv_sec % 86400)*10000 + tv.tv_usec / 100;
* 10000和/ 100没有错,因为这段代码即将生成一个seqId。
现在,我正在尝试使用 C++11 的 std::chrono 来替换它。这是我的代码:
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 不能这样做?
【问题讨论】:
标签: c++11 chrono gettimeofday