在Linux中如何获取毫秒级时间戳?使用C++编程。

3

如何将std::chrono::monotonic_clock::now()转换为毫秒并将其强制转换为long?

使用steady_clock或high_resolution_clock也是一样的。我已经研究了std::chrono::duration_cast<std::chrono::milliseconds>,但我只需要当前时间戳,而不是任何持续时间间隔。


1
clock_gettime()gettimeofday()都可以以轻松转换为毫秒的方式获取当前时间戳。您是否特别想使用std::chrono中的结构? - Chad
我正在寻找一些不受NTP调整或任何更改影响的东西。我听说clock_gettime()不能完全可靠。gettimeofday也是可变的。 - King
clock_gettime(CLOCK_MONOTONIC) 是由 std::chrono::monotonic_clock 使用的原语。 它是尽可能“不受 NTP 调整或任何更改”的。 - zwol
2
@Zack:看一下这里CLOCK_MONOTONICCLOCK_MONOTONIC_RAW的定义链接,你可能会感到惊讶。 - interjay
所以有一个CLOCK_MONOTONIC_RAW,很奇怪。所以如果chrono使用clock_gettime()作为原语,至少它可能会使用这个原始类型 :) - King
@interjay 我的观点只是 std::chrono 不能比它使用的底层原语(在这种情况下为 clock_gettime)更好。我承认我不理解为什么Linux引入了 CLOCK_MONOTONICCLOCK_MONOTONIC_RAW 之间的区别 -- "一个不能被设置的时钟" 暗示着 "不受 NTP 调整的影响"。 - zwol
2个回答

8

当前时间戳是与某个时间点相关定义的(因此它是一个时间间隔)。例如,通常可以获取与时代开始(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类型。

2
@King 那也应该可以。now() 返回所有时钟的 time_point,所以你只需要更改时钟类型即可。 - betabandido
1
对我不起作用。无法将'std::chrono::system_clock::time_point'转换为'std::chrono::time_point<_Clock>' - Qix - MONICA WAS MISTREATED
@Qix它在gcc(版本4.7)中可以编译通过,我相信在之前的版本中也能工作。你使用的是哪个编译器?有可能是你的编译器还不完全支持C++11。 - betabandido
MSVC 11(2012年版)。Anthony Williams的解决方案编译良好。我知道我的编译器支持C++11。 - Qix - MONICA WAS MISTREATED
我该如何将它转换为int64_t? - Pototo
显示剩余11条评论

3
所有内置的时钟都有一个关联的“纪元”,即它们的基本时间。实际的纪元日期/时间没有指定,可能因时钟而异。
如果你只想要一个用于比较的数字,那么some-clock::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或其他源的相应时间一起获取基线计数,然后使用它将相对计数转换为绝对时间。


time_t是指仅秒的整数。因此,当我们需要毫秒而不仅仅是秒时,将其转换为time_t并没有太大帮助。是的,这是一个Unix特定的问题。我同意纪元根据计算平台的不同而有所不同。如果有人需要便携式代码,则应该设置纪元。 - King

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