0

在我的 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

4

1 回答 1

0

您不必拘泥于库提供的持续时间类型。您可以定义自己的具有您需要的表示形式:

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。]

于 2021-11-19T12:46:40.687 回答