在我的 C++ 项目中,有一个很老的函数,它使用 Linux 的系统函数来做一些关于时间的计算。
这是一段代码:
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
?