获取自纪元以来的当前时间戳(微秒)?

13

我有一段以下的代码,我们试图使用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库,因为这是我们所有代码都在使用的。


2
@πάνταῥεῖ std::uint64_t?至少现在还是用这个吧。在我写这段话的时候,当前时间自纪元以来已经过去了1440440480秒,也就是0x51dac207a0000微秒。 - Nik Bougalis
1
@πάνταῥεῖ uint64_t ... - Alex Lop.
抱歉,大家对于纳秒精度我暂时有些困惑。 - πάντα ῥεῖ
2个回答

21

chrono时钟的纪元是未指定的,但实际上你可以这样考虑:

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

  2. system_clock 的纪元是从1970年新年以来,在UTC时区中不计闰秒的时间。不同的实现使用不同的精度: libc++计算微秒,VS计算十分之一微秒,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,在闰年中会出现问题吗? - user1950349
@user1950349 - 闰秒是对官方时间的调整,因为地球轨道略微摇晃(非常微小),所以有时我们会提前半秒钟到达。由于计算时间已经够难了,计算机通常忽略这一点。 - Bo Persson
但是如果你真的想要玩跳秒,这里有一个库和示例告诉你如何做:http://howardhinnant.github.io/tz.html#flightexample2 - Howard Hinnant
是的,我指的是 system_clock,抱歉让您感到困惑。 - user1950349
1
@HowardHinnant 我非常感谢您分享这段代码。这是我第一次看到它被提到。谢谢。 - Captain Giraffe
显示剩余4条评论

14

对于那些无法使其他解决方案正常工作的人来说,另一个可能性是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接