我有一个以下代码,我们试图从纪元时间开始以微秒为单位获取当前时间戳,但我们正在使用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
包,因为这就是我们所有代码所使用的内容。
答案 0 :(得分:9)
计时钟的时代是未指定的。但实际上你可以用这种方式来考虑计时钟:
steady_clock
的时代是您的应用程序启动的时间加上签名的随机偏移量。即在应用程序启动时,您不能依赖于相同的时代。但是,当应用程序运行时,时代将保持稳定。
system_clock
的时代是自1970年新世纪以来的时间,不计算UTC时区的闰秒。不同的实现以不同的精度实现它:libc ++计数微秒,VS计数1/10微秒,gcc计数纳秒。
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());
答案 1 :(得分:0)
无法获得其他解决方案的人的另一种可能性:
__int64 microseconds_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();