如何将std::chrono::monotonic_clock::now()
转换为毫秒并将其强制转换为long?
使用steady_clock或high_resolution_clock也是一样的。我已经研究了std::chrono::duration_cast<std::chrono::milliseconds>
,但我只需要当前时间戳,而不是任何持续时间间隔。
如何将std::chrono::monotonic_clock::now()
转换为毫秒并将其强制转换为long?
使用steady_clock或high_resolution_clock也是一样的。我已经研究了std::chrono::duration_cast<std::chrono::milliseconds>
,但我只需要当前时间戳,而不是任何持续时间间隔。
当前时间戳是与某个时间点相关定义的(因此它是一个时间间隔)。例如,通常可以获取与时代开始(Unix 中的 1970 年 1 月 1 日)相关的时间戳。您可以使用 time_since_epoch()
来实现:
namespace chr = std::chrono;
chr::time_point<chr::steady_clock> tp = chr::steady_clock::now();
std::cout << "hours since epoch: "
<< chr::duration_cast<chr::hours>(tp.time_since_epoch()).count()
<< '\n';
std::chrono::milliseconds
类型。now()
返回所有时钟的 time_point
,所以你只需要更改时钟类型即可。 - betabandido无法将'std::chrono::system_clock::time_point'转换为'std::chrono::time_point<_Clock>'
。 - Qix - MONICA WAS MISTREATED::now().time_since_epoch()
将为该时钟自纪元以来经过的时间提供一个duration
,你可以通过duration
类型的count()
成员将其转换为整数。单位取决于时钟的period
。如果你想要特定的单位,则首先使用duration_cast
:typedef std::chrono::steady_clock clk;
unsigned long long milliseconds_since_epoch=
std::chrono::duration_cast<std::chrono::milliseconds>(
clk::now().time_since_epoch()).count();
正如我所说,这仅适用于比较,而不是作为绝对时间戳,因为纪元未指定。
如果您需要UNIX时间戳,则需要使用std::chrono::system_clock
,它具有to_time_t()
函数,用于将time_point
转换为time_t
。
或者,您可以在程序的特定点与来自gettimeofday
或其他源的相应时间一起获取基线计数,然后使用它将相对计数转换为绝对时间。
clock_gettime()
或gettimeofday()
都可以以轻松转换为毫秒的方式获取当前时间戳。您是否特别想使用std::chrono
中的结构? - Chadclock_gettime(CLOCK_MONOTONIC)
是由std::chrono::monotonic_clock
使用的原语。 它是尽可能“不受 NTP 调整或任何更改”的。 - zwolCLOCK_MONOTONIC
和CLOCK_MONOTONIC_RAW
的定义链接,你可能会感到惊讶。 - interjaystd::chrono
不能比它使用的底层原语(在这种情况下为clock_gettime
)更好。我承认我不理解为什么Linux引入了CLOCK_MONOTONIC
和CLOCK_MONOTONIC_RAW
之间的区别 -- "一个不能被设置的时钟" 暗示着 "不受 NTP 调整的影响"。 - zwol