C++ std::chrono::high_resolution_clock time_since_epoch returns 数字太小。如何获得自 1970 年以来以微秒为单位的正确时间?

C++ std::chrono::high_resolution_clock time_since_epoch returns too small numbers. How can I get the correct time since 1970 in microseconds?

我正在尝试编写一个函数,它将 return 自 1970 年以来的当前时间(以微秒为单位)。在调试时我注意到,returned 数字太小了。例如:269104616249。我还添加了 static_assert 来检查 returned 值类型是 int64_t,我足够大以微秒为单位保持 292471 年。所以整数溢出不应该是这里的情况。 我究竟做错了什么? 这是我的代码:

int64_t NowInMicroseconds() {
    static_assert(std::is_same<decltype(duration_cast<microseconds>(high_resolution_clock::now().time_since_epoch()).count()), int64_t>::value);
    return duration_cast<microseconds>(high_resolution_clock::now().time_since_epoch()).count();
}

int64_t result = NowInMicroseconds();

C++11/14/17 中有三个计时提供的时钟(C++20 中更多):

  1. system_clock:这测量 Unix Time(自 1970 年以来的时间,不包括闰秒)。1

  2. steady_clock:就像秒表一样。非常适合计时,但它不能告诉你一天中的时间。

  3. high_resolution_clock:这个有system_clocksteady_clock的缺点,也没有优点。通常它是 system_clocksteady_clock 的类型别名,并且因平台而异。

您必须使用 system_clock 来衡量自 1970 年以来的时间。请注意,这是以 UTC 衡量的,不是 您的 local 时区。在 C++11/14/17 中,要获取 1970 年以来的当地时间,您必须手动考虑您的时区,或者使用此 C++20 chrono preview library.

std::int64_t
NowInMicroseconds()
{
    using namespace std::chrono;
    return duration_cast<microseconds>(system_clock_clock::now().time_since_epoch()).count();
}

考虑返回一个强类型,这意味着“自 1970 年以来的微秒”,而不是整数类型。强类型安全帮助您在编译时发现您的逻辑错误:

std::chrono::time_point<std::chrono::system_clock, std::chrono::microseconds>
NowInMicroseconds()
{
    using namespace std::chrono;
    return time_point_cast<microseconds>(system_clock.now());
}

1 这在 C++11/14/17 中未指定,但在所有实现中都是如此。 C++20 finally nails this epoch down in the spec.