从 struct timespec 转换为 std::chrono::?

Converting from struct timespec to std::chrono::?

我有一个 struct timespec 值流。我想将它们转换为本机 C++11 表示,但我完全被 chrono 打败了。什么是最佳目的​​地以及如何从 struct timespec 或 struct timeval 到达那里,因为这是一个简单的转换,微秒对这些计时来说已经足够了?我想我想了解这个,对吧? std::chrono::system_clock::time_point

在这种情况下,timespec 是来自 GPS 的 UNIX 时间。是的,他们正在使用 4 字节秒(转换后的形式在内存中签名,然后写成无符号),到 2038 年将被确定。

作为参考,我会将其添加到 C++ reader 以供 gsf

有时我看到 timespectimeval 用作持续时间,有时我看到它们用作时间点。你必须知道你持有什么样的价值观。在<chrono>这两个概念是不同的类型。

持续时间是一个时间量:您可以用秒表测量的时间。示例持续时间为 2 分钟、3 秒、4 小时和 16 年。

时间点是特定时间:美国东部时间 2015 年 7 月 14 日下午 2 点,或者自从我启动计算机后 6 小时。一个时间点有一个与之关联的隐含纪元。一个纪元只是一些双方同意的起点,您以此为起点测量时间。

如果您的 timespec 持有持续时间:

timespec ts = {3, 123};  // 3 seconds + 123 nanoseconds
auto d = std::chrono::seconds{ts.seconds}
       + std::chrono::nanoseconds{ts.nanoseconds};

如果你的 timespec 持有时间点,你必须知道纪元。纪元很可能是 1970-01-01 00:00:00 UTC,忽略闰秒(这是 Unix time)。如果是这样,你可以把它变成std::chrono::system_clock::time_point。这种类型保证有这个纪元,但每个实现都有:

using namespace std::chrono;
system_clock::time_point tp{duration_cast<system_clock::duration>(d)};

其中 d 如上计算。

如果你有 timeval,那么在我使用 nanoseconds 的地方使用 microseconds

您不能移植地使用 high_resolution_clocksteady_clock time_points,因为不同的实现对这些类型有不同的纪元。

此外,如果您使用 timeval,实际上 duration_cast 变得不必要,因为持续时间 d 将隐式转换为 system_clock::duration 的所有实现:

using namespace std::chrono;
system_clock::time_point tp{d};

如果您不确定是否需要 duration_cast,请尝试不使用。如果它编译,你不需要它。如果遇到编译时错误,则确实需要它。转换持续时间时需要它,并且没有精确的转换。