获取从epoch开始以微秒为单位的当前时间戳

Get current timestamp in microseconds since epoch?

本文关键字:为单位 时间戳 epoch 开始 获取      更新时间:2023-10-16

我有一个下面的代码,我们试图获得当前时间戳在微秒自epoch时间,但我们使用的是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包,因为这是我们所有的代码都在使用。

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

  1. steady_clock的纪元是应用程序启动的时间加上一个有符号的随机偏移量。也就是说,你不能指望应用程序启动时的epoch是相同的。但是epoch会在应用程序运行时保持稳定

  2. system_clock的纪元是自1970年新年以来的时间,不包括闰秒,在UTC时区。不同的实现以不同的精度实现: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());

无法找到其他解决方案的人的另一种可能性:

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