C++ C++;-在linux中如何获得毫秒时间戳?

C++ C++;-在linux中如何获得毫秒时间戳?,c++,gcc,c++11,unix-timestamp,chrono,C++,Gcc,C++11,Unix Timestamp,Chrono,如何将std::chrono::monotonic_clock::now()转换为毫秒并转换为long 使用来自chrono的稳定时钟或高分辨率时钟也是一样的。我看过std::chrono::duration\u cast,但我只想要当前的时间戳,而不想要任何持续时间间隔 当前时间戳是相对于某个时间点定义的(因此它是一个持续时间)。例如,“典型的”情况是获取一个关于新纪元开始的时间戳(在Unix中为1970年1月1日)。您可以使用以下方法进行此操作: 名称空间chr=std::chrono; c

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


使用来自chrono的稳定时钟或高分辨率时钟也是一样的。我看过std::chrono::duration\u cast,但我只想要当前的时间戳,而不想要任何持续时间间隔

当前时间戳是相对于某个时间点定义的(因此它是一个持续时间)。例如,“典型的”情况是获取一个关于新纪元开始的时间戳(在Unix中为1970年1月1日)。您可以使用以下方法进行此操作:

名称空间chr=std::chrono;
chr::time_point tp=chr::stable_clock::now();

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

如果您只需要一个数字进行比较,那么一些时钟
::now().time\u since\u epoch()
将为您提供该时钟自epoch以来的
持续时间,您可以使用
duration
类型的
count()
成员将其转换为整数。其单位取决于时钟的
周期。如果需要特定单位,请先使用
持续时间\u 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();
typedef std::chrono::稳定时钟时钟时钟;
自\u纪元以来的无符号长毫秒\u=
标准::计时::持续时间(
clk::now().time_since_epoch()).count();
正如我所说的,这只适用于比较,而不是作为绝对时间戳,因为时代尚未确定

如果需要UNIX时间戳,则需要使用
std::chrono::system\u clock
,它具有一个
to\u time\t()
函数,用于将
时间点
转换为
时间


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

clock\u gettime()
gettimeofday()
两者都以一种很容易转换为毫秒的方式获取当前时间戳。您是否特别希望使用来自
std::chrono
的构造?我希望不受NTP调整或任何更改的影响。我听说clock_gettime()不能完全可靠。gettimeofday也是可变的。
clock\u gettime(clock\u MONOTONIC)
是std::chrono::MONOTONIC\u clock
使用的原语。这是你能得到的“不受NTP调整或任何变化的影响”。@Zack:看看
CLOCK\u MONOTONIC
CLOCK\u MONOTONIC\u RAW
的定义,你可能会感到惊讶。所以有一个CLOCK\u MONOTONIC\u RAW,奇怪。因此,如果chrono使用clock_gettime()作为基元,至少它使用这个原始类型可能是:)我会标记这个答案,但我将使用高分辨率的时钟,因为它有尽可能短的可用刻度。@King这也应该行得通
now()
返回所有时钟的
时间点
,因此您只需更改为时钟类型。是。刚才提到,它是精度更好的选择。时钟的纪元不一定是1970年1月1日的Unix纪元。它很可能是别的东西,比如启动时间,或者程序启动时间。对我来说不起作用<代码>无法从“std::chrono::system\u clock::time\u point”转换为“std::chrono::time\u point”
时间\t是一个仅表示秒数的整数。因此,当我们只需要几毫秒而不只是几秒钟时,转换为时间并没有多大帮助。对这是一个特定于unix的问题。我同意,根据计算平台的不同,历元是不同的。若有人需要一个可移植的代码,那个么他们应该设定一个新纪元。
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();