3

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

使用来自 chrono 的 stable_clock 或 high_resolution_clock 也是一样的。我已经看到了std::chrono::duration_cast<std::chrono::milliseconds>,但我只想要当前的时间戳而不是任何持续时间间隔。

4

2 回答 2

8

当前时间戳是相对于某个时间点定义的(因此它是一个持续时间)。例如,“典型的”是获取关于纪元开始的时间戳(1970 年 1 月 1 日,在 Unix 中)。您可以通过使用来做到这一点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.

于 2012-06-19T17:44:27.467 回答
3

所有内置时钟都有一个相关的“纪元”,这是它们的基准时间。未指定纪元的实际日期/时间,并且可能因时钟而异。

如果您只想要一个数字进行比较,那么some-clock::now().time_since_epoch()会给您一个duration自该时钟的纪元以来的时间,您可以使用count()该类型的成员将其转换为整数duration。其单位将取决于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()将 a 转换为time_pointa的功能time_t

或者,您可以在程序中的特定点获取基线计数,以及相应的时间gettimeofday,然后使用它将相对计数转换为绝对时间。

于 2012-06-20T07:36:15.977 回答