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

时间:2015-07-14 14:07:08

标签: c++ time chrono

我有一个struct timespec值的流。我想将它们转换为本机C ++ 11表示,但我完全被chrono扭转了。什么是最好的目的地以及如何从struct timespec或struct timeval到达那里,因为这是一个简单的转换,微秒对于这些时间是否足够好?我认为我想要达到这个目标,对吧?     的std ::计时:: SYSTEM_CLOCK :: time_point

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

作为参考,我将把它添加到gsf

的C ++阅读器中

1 个答案:

答案 0 :(得分:21)

有时我会将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,请使用我microseconds使用的nanoseconds

您无法移植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,请不要尝试。如果它编译,你不需要它。如果遇到编译时错误,则确实需要它。转换持续时间并且没有确切的转换时需要它。