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

标签 c++ chrono

我正在尝试编写一个函数,它将返回自 1970 年以来的当前时间(以微秒为单位)。在调试时我注意到,返回的数字太小了。例如:269104616249。我还添加了 static_assert 来检查返回值类型是 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 中有三个 chrono 提供的时钟(C++20 中更多):

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

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

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

自 1970 年以来,您必须使用 system_clock 来测量时间。请注意,这是以 UTC 测量的,不是您的本地时区。在 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.

关于C++ std::chrono::high_resolution_clock time_since_epoch 返回的数字太小。如何获得自 1970 年以来以微秒为单位的正确时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68906605/

相关文章:

c++ - 在对齐的内存缓冲区中为 capnp FlatArrayMessageReader 接收 zmq 消息

c++ - 我需要帮助来理解如何找到代码段的 Big-Oh

c++ - Exe 在 BackupRead Windows 函数中崩溃

c++ - 两个日期之间的秒数,包括闰秒

c++ - 将持续时间值设为双倍

c++ - 只读取来自 Kafka 主题的最后一条消息

导入 makefile 并运行提升单元测试的 C++ Linux IDE

c++ - std::chrono::high_resolution_clock 的分辨率与测量值不对应

c++ - 使用chrono C++与时间进行比较

c++ - C++向chrono::system_clock::time_point添加月份