【问题标题】:Get current timestamp in microseconds since epoch?获取自纪元以来的当前时间戳(以微秒为单位)?
【发布时间】:2015-11-18 06:28:03
【问题描述】:

我有一个下面的代码,我们试图从中获取自纪元时间以来的当前时间戳(以微秒为单位),但我们使用的是steady_clock

inline uint64_t get_timestamp()
{
    std::chrono::time_point<std::chrono::steady_clock> ts = std::chrono::steady_clock::now();
    return std::chrono::duration_cast<std::chrono::microseconds>(ts.time_since_epoch()).count();
}

这是正确的方法吗,因为根据我的理解steady_clock 用于衡量时间的流逝而不是获取当前时间?或者我应该使用system_clock 如下所示:

inline uint64_t get_timestamp()
{
    std::chrono::time_point<std::chrono::system_clock> ts = std::chrono::system_clock::now();
    return std::chrono::duration_cast<std::chrono::microseconds>(ts.time_since_epoch()).count();
}

我只需要使用std::chrono 包,因为这是我们所有的代码都在使用的。

【问题讨论】:

  • @πάνταῥεῖ std::uint64_t?无论如何,至少会再长一点。在撰写本文时,自纪元以来的当前时间为 1440440480 秒,即 0x51dac207a0000 微秒。
  • @πάνταῥεῖ uint64_t ...
  • 抱歉,暂时对纳秒精度感到困惑。

标签: c++ timestamp chrono


【解决方案1】:

计时时钟的历元未指定。但实际上你可以这样想计时时钟:

  1. steady_clock 的纪元是您的应用程序启动的时间加上一个带符号的随机偏移量。 IE。您不能依赖于跨应用程序启动的时代相同。但是当应用程序运行时,epoch 将保持稳定。

  2. system_clock 的纪元是 UTC 时区自 1970 年新年以来的时间,不包括闰秒。不同的实现以不同的精度实现这一点:libc++ 以微秒计,VS 以 1/10 微秒计,而 gcc 以纳秒计。

  3. high_resolution_clock 有时是 steady_clock 的类型别名,有时是 system_clock 的类型别名。

对于以微秒为单位的时间戳,我建议首先定义此类型别名:

using time_stamp = std::chrono::time_point<std::chrono::system_clock,
                                           std::chrono::microseconds>;

存储它,而不是 uint64_t。这种类型的类型安全将为您节省无数的运行时错误。相反,您会在编译时发现错误。

您可以通过以下方式获取当前的time_stamp

using namespace std::chrono;
time_stamp ts = time_point_cast<microseconds>(system_clock::now());

【讨论】:

  • 感谢您的建议。如果我们使用steady_clock,我们会在闰年看到任何问题吗?
  • 你的意思是system_clock?!
  • @user1950349 - leap seconds 是对官方时间的调整,因为地球的轨道有点不稳定(非常轻微),所以有时我们会提前半秒到达。计算机通常会忽略这一点,因为无论如何计算时间已经够难了。
  • 但如果你真的想玩闰秒,这里有一个库 + 示例:howardhinnant.github.io/tz.html#flightexample2
  • @HowardHinnant 非常感谢您分享此代码。这是我第一次看到它被提及。谢谢。
【解决方案2】:

对于无法使用其他解决方案的人的另一种可能性:

uint64_t microseconds_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2017-01-15
    • 2015-09-22
    相关资源
    最近更新 更多