【问题标题】:C++ std::chrono::high_resolution_clock time_since_epoch returns too small numbers. How can I get the correct time since 1970 in microseconds?C++ std::chrono::high_resolution_clock time_since_epoch 返回的数字太小。如何获得自 1970 年以来的正确时间(以微秒为单位)?
【发布时间】:2021-08-24 11:19:07
【问题描述】:

我正在尝试编写一个函数,它将返回自 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();

【问题讨论】:

  • 我检查了 int64_t 的最大值是 9223372036854775807,足以容纳 292471 年的微秒。
  • 我收到1629804220239351 here。我们可以得到minimal reproducible example吗?
  • @NathanOliver 这不是也只有 5 年吗?
  • 最小的可重现示例只是调用函数 NowInMicroseconds
  • @user32434999 我得到了大约 51 年的价值。看起来你可能会偏离 10 倍

标签: c++ chrono


【解决方案1】:

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

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

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

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

您必须使用system_clock 来衡量自 1970 年以来的时间。请注意,这是以 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2012-07-06
    • 2013-11-02
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多