Kur*_*ehr 10 c++ time c++-chrono
我有一个struct timespec值的流.我想将它们转换为本机C++ 11表示,但我完全被chrono扭转了.什么是最好的目标以及如何从struct timespec或struct timeval到达那里,因为这是一个简单的转换,微秒对于这些时间是否足够好?我认为我想要达到这个目标,对吧?的std ::时辰:: SYSTEM_CLOCK :: time_point
在这种情况下,timespec是来自GPS的UNIX时间.是的,他们使用的是4字节秒(在内存中签名转换后的格式,然后写成无符号格式),它将被固定到2038年.
作为参考,我将把它添加到gsf的C++阅读器中
How*_*ant 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};
Run Code Online (Sandbox Code Playgroud)
如果你timespec有一个时间点,你必须知道这个时代.该纪元很可能是1970-01-01 00:00:00 UTC,忽略了闰秒(这是Unix时间).如果是这样,你可以把它放进去std::chrono::system_clock::time_point.这种类型不保证有这个时代,但每个实现都有:
using namespace std::chrono;
system_clock::time_point tp{duration_cast<system_clock::duration>(d)};
Run Code Online (Sandbox Code Playgroud)
在哪里d计算如上.
如果你有timeval,那就使用microseconds我用过的地方nanoseconds.
您无法移植high_resolution_clock或使用steady_clocktime_points,因为不同的实现具有针对这些类型的不同时期.
此外,如果您正在使用timeval,在实践中duration_cast变得不必要,因为持续时间d将隐式转换为以下所有实现system_clock::duration:
using namespace std::chrono;
system_clock::time_point tp{d};
Run Code Online (Sandbox Code Playgroud)
如果您不确定是否需要,请duration_cast不要尝试.如果它编译,你不需要它.如果遇到编译时错误,则确实需要它.转换持续时间并且没有精确转换时需要它.