我有一个struct timespec值的流。我想将它们转换为本机C ++ 11表示,但我完全被chrono扭转了。什么是最好的目的地以及如何从struct timespec或struct timeval到达那里,因为这是一个简单的转换,微秒对于这些时间是否足够好?我认为我想要达到这个目标,对吧? 的std ::计时:: SYSTEM_CLOCK :: time_point
在这种情况下,timespec
是来自GPS的UNIX时间。是的,他们使用的是4字节秒(在内存中签名转换后的格式,然后写成无符号格式),它将被钉在2038年之前。
作为参考,我将把它添加到gsf
的C ++阅读器中答案 0 :(得分:21)
有时我会将timespec
和timeval
视为持续时间,有时我会将其视为时间点。你必须知道你持有什么样的价值观。在<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_clock
或steady_clock
time_points,因为不同的实现对这些类型有不同的时期。
此外,如果您使用timeval
,则实际情况duration_cast
变得不必要,因为持续时间d
会隐式转换为system_clock::duration
的所有实现:
using namespace std::chrono;
system_clock::time_point tp{d};
如果您不确定是否需要duration_cast
,请不要尝试。如果它编译,你不需要它。如果遇到编译时错误,则确实需要它。转换持续时间并且没有确切的转换时需要它。