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

14
我有一串struct timespec的值。我想将它们转换为本地C++11表示形式,但chrono让我感到困惑。从struct timespec或struct timeval转换是很容易的,对于这些计时来说,微秒足够了。我认为我想要得到的是std::chrono::system_clock::time_point。
在这种情况下,timespec是来自GPS的UNIX时间。是的,它们使用4字节的秒(从内存中转换为有符号数,然后写为无符号数),将在2038年之前被限制。
供参考,我将把这个添加到gsf的C++读取器中。
1个回答

26
有时我看到 timespec timeval 被用作时间间隔,有时我看到它们被用作时间点。您需要知道所持有的值的类型。在<chrono>中,这两个概念是不同的类型。
一个duration是一段时间:您会用秒表来测量它。例子包括 2 分钟、3 秒、4 小时和 16 年。
time point是一个特定的时间:2015年7月14日下午2点EDT,或者距离我启动计算机已经6小时。time point有一个与之相关联的暗示纪元。一个纪元只是一些共同商定的起点,您可以从中测量时间。
如果您的 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时间)。如果是这样,您可以将它放入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_clocksteady_clock时间点,因为不同的实现对这些类型有不同的纪元。

此外,如果您正在使用timeval,实际上duration_cast变得不必要,因为持续时间d将隐式转换为所有system_clock::duration的实现:

using namespace std::chrono;
system_clock::time_point tp{d};

如果您不确定是否需要使用duration_cast,可以尝试不使用它。如果编译通过,则无需使用它。如果出现编译时错误,则需要使用它。在转换持续时间时,需要使用它,当不存在精确的转换时。


std::chrono::system_clock拥有方便的方法from_time_tto_time_t。如果我们谈论time_points,这些方法应该确保更可移植的转换。 - user666412
1
@user666412:是的,我将from_time_tto_time_t放入了C++11中。不幸的是,time_t通常既是整数又表示秒数,而timespectimeval表示比秒更细的单位。因此,通过to/from_time_t意味着你必须将精度截断到秒,然后以某种方式恢复该精度。说实话,to/from_time_t的好处在于它鼓励实现者使用UnixTime“标准”来处理system_clock。 :-) - Howard Hinnant
有趣的事实。谢谢分享。我认为to/from_time_t是一种便携式调整纪元的方法,因为这可能是实现特定的,并且秒的分数可以像您使用持续时间一样添加。 - user666412
1
@user666412:你说得对,使用 to/from_time_t 是目前唯一标准认可的方法。我正在努力将 system_clock 的纪元标准化为 UnixTime。我已经得到了所有实现者的个人保证,他们会这样做。但这当然不是官方的,只有在实现者改变或标准锁定之前才有效。目前,我的提案包括许多其他内容,使其风险非常高:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0355r1.html#Wording - Howard Hinnant
1
C++20修复了system_clock的时代,以匹配Unix时间:http://eel.is/c++draft/time.clock.system#overview-1 - Howard Hinnant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接