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

时间:2015-08-24 18:13:01

标签: c++ timestamp 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();
}

这是否是正确的方法,因为根据我的理解,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 个答案:

答案 0 :(得分:9)

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

  1. steady_clock的时代是您的应用程序启动的时间加上签名的随机偏移量。即在应用程序启动时,您不能依赖于相同的时代。但是,当应用程序运行时,时代将保持稳定。

  2. system_clock的时代是自1970年新世纪以来的时间,不计算UTC时区的闰秒。不同的实现以不同的精度实现它:libc ++计数微秒,VS计数1/10微秒,gcc计数纳秒。

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

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

    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());
    

答案 1 :(得分:0)

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

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