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

时间:2012-06-19 13:43:09

标签: c++ gcc c++11 unix-timestamp chrono

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

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

2 个答案:

答案 0 :(得分:8)

当前时间戳是根据某个时间点定义的(因此它是一个持续时间)。例如,相对于Epoch的开头(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

答案 1 :(得分:3)

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

如果你只是想要一个数字进行比较,那么某个时钟 ::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()函数可将time_point转换为time_t

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