从纪元开始获取当前时间戳(以微秒为单位)?

use*_*349 4 c++ timestamp c++-chrono

我有一个下面的代码,我们试图从纪元时间以微秒为单位获取当前时间戳,但我们正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

这是否是正确的方法,因为根据我的理解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();
}
Run Code Online (Sandbox Code Playgroud)

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

How*_*ant 10

计时钟的时代是未指定的.但实际上你可以用这种方式来考虑计时钟:

  1. 的时代steady_clock是应用程序启动的时间加上一个签名随机偏移.也就是说,你不能依赖于应用程序发布时的相同时代.但是在应用程序运行时,时代将保持稳定.

  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>;
Run Code Online (Sandbox Code Playgroud)

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

您可以获得最新信息time_stamp:

using namespace std::chrono;
time_stamp ts = time_point_cast<microseconds>(system_clock::now());
Run Code Online (Sandbox Code Playgroud)


Lor*_*une 8

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

uint64_t microseconds_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
Run Code Online (Sandbox Code Playgroud)