从 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
有时我看到 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
,那么在我使用 nanoseconds
的地方使用 microseconds
。
您不能移植地使用 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
,请尝试不使用。如果它编译,你不需要它。如果遇到编译时错误,则确实需要它。转换持续时间时需要它,并且没有精确的转换。
我有一个 struct timespec 值流。我想将它们转换为本机 C++11 表示,但我完全被 chrono 打败了。什么是最佳目的地以及如何从 struct timespec 或 struct timeval 到达那里,因为这是一个简单的转换,微秒对这些计时来说已经足够了?我想我想了解这个,对吧? std::chrono::system_clock::time_point
在这种情况下,timespec
是来自 GPS 的 UNIX 时间。是的,他们正在使用 4 字节秒(转换后的形式在内存中签名,然后写成无符号),到 2038 年将被确定。
作为参考,我会将其添加到 C++ reader 以供 gsf
有时我看到 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
,那么在我使用 nanoseconds
的地方使用 microseconds
。
您不能移植地使用 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
,请尝试不使用。如果它编译,你不需要它。如果遇到编译时错误,则确实需要它。转换持续时间时需要它,并且没有精确的转换。