【问题标题】:Converting from struct timespec to std::chrono::?从 struct timespec 转换为 std::chrono::?
【发布时间】:2015-10-03 05:34:51
【问题描述】:

我有一个 struct timespec 值流。我想将它们转换为原生 C++11 表示,但我完全被 chrono 所扭转。什么是最好的目的地以及如何从 struct timespec 或 struct timeval 到达那里,因为这是一个简单的转换并且微秒对于这些时间来说已经足够了?我想我想做到这一点,对吧? std::chrono::system_clock::time_point

在这种情况下,timespec 是来自 GPS 的 UNIX 时间。是的,他们正在使用 4 字节秒(转换后的形式在内存中签名,然后写为无符号),这将在 2038 年完成。

作为参考,我将把它添加到 gsf 的 C++ 阅读器中

【问题讨论】:

    标签: c++ time chrono


    【解决方案1】:

    有时我看到timespectimeval 用作持续时间,有时我看到它们用作时间点。你必须知道你持有什么样的价值观。在<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_clocksteady_clock time_points,因为不同的实现对这些类型有不同的时期。

    此外,如果您使用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:是的。我将from_time_tto_time_t 放入C++11。 :-) 不幸的是,time_t 通常都是整数并表示秒,而timespectimeval 都表示小于一秒的单位。因此,通过to/from_time_t 意味着您必须将精度截断到秒,然后以某种方式恢复该精度。在你我之间,to/from_time_t 的好处是它鼓励实现者使用 UnixTime“标准”来处理system_clock。 :-)
    • 有趣的事实。谢谢你的分享。我只是认为to/from_time_t 是一种调整纪元的可移植方式,因为它可以是特定于实现的,并且可以像添加持续时间一样添加秒的分数。
    • @user666412:你说得对,to/from_time_t 的使用是今天唯一符合标准的方法。我正在努力将system_clock 的时代标准化为 UnixTime。我有所有实施者的个人保证,他们会这样做。但这当然不是官方的,只有在实施者发生变化或标准将其锁定之前才是好的。目前我锁定这个时代的提议包括很多其他的东西,这使得它的风险非常高:open-std.org/jtc1/sc22/wg21/docs/papers/2016/…
    • C++20 修复了 system_clock 的纪元以匹配 Unix Time 的纪元:eel.is/c++draft/time.clock.system#overview-1
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2021-02-03
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多