执着std::chronotime_point<steady_clock>

Persistent std::chrono time_point<steady_clock>

我在我的项目中使用了一些 time_point<steady_clock> 变量以便在特定时间间隔进行操作。我想在文件中 serialize/deserialize 这些值。

但是好像steady_clocktime_since_epoch不靠谱,虽然system_clocktime_since_epoch还可以,但总是从1970年算起/1/1(UNIX 时间)

最适合我的解决方案是什么?看来我必须以某种方式从 steady_clock 转换为 system_clock,但我认为这是无法实现的。

P.S。我已经在这里阅读了主题:Persisting std::chrono time_point instances

std::chrono::steady_clock 的 cppreference 页面上,它说:

This clock is not related to wall clock time (for example, it can be time since last reboot), and is most suitable for measuring intervals.

std::chrono::system_clock 的页面说大多数实现使用 UTC 作为纪元:

The epoch of system_clock is unspecified, but most implementations use Unix Time (i.e., time since 00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970, not counting leap seconds).

如果您尝试比较不同机器的时间或希望将记录的时间与现实世界的事件相关联(即今天下午 3 点出现问题),那么您需要将代码切换为使用系统时钟。任何时候您重新启动稳定时钟将重置,它与挂钟时间完全无关。

编辑: 如果您想在 steadysystem 时间戳之间进行近似转换,您可以这样做:

template <typename To, typename FromTimePoint>
typename To::time_point approximate_conversion(const FromTimePoint& from) {
    const auto to_now = To::now().time_since_epoch();
    const auto from_now = FromTimePoint::clock::now().time_since_epoch();

    // compute an approximate offset between the clocks and apply that to the input timestamp
    const auto approx_offset = to_now - from_now;
    return typename To::time_point{from.time_since_epoch() + approx_offset};
}

int main() {
    auto steady = std::chrono::steady_clock::now();
    auto system = approximate_conversion<std::chrono::system_clock>(steady);
}

这是假设时钟不会很快分开,并且两个时钟都没有大的不连续性(这两个假设在很长一段时间内都是错误的)。