有时我看到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,请尝试不使用。如果它编译,你不需要它。如果你得到一个编译时错误,你确实需要它。转换时长时需要它,并且没有精确的转换。