将 time_point 降低到给定持续时间的推荐方法
recommended way to floor time_point to a given duration
我有一个用户提供的持续时间
const int period_seconds = cfg.period_seconds;
我想 floor
一个 time_point
到那个 duration
的粒度。
我看到 time_point
and duration
有一个 std::chrono::floor
函数,但是如何使用它们来完成我正在寻找的事情并不是很明显。
我有以下有效的玩具示例:
const auto seconds = std::chrono::seconds{period_seconds};
const auto period = std::chrono::duration_cast<std::chrono::nanoseconds>(seconds);
const auto now = std::chrono::system_clock::now();
const auto floored = now - (now.time_since_epoch() % period);
以上代码的净效果,持续 10 秒如下:
now: 2022-04-19 15:06:26.781772408
floored: 2022-04-19 15:06:20.000000000 # so "floors" the 25.78 seconds to 20 seconds
我忍不住觉得根据 time_since_epoch
和模数运算符工作并不是获得我正在寻找的结果的“正确”方式...
是否有“更好的”/推荐的方法来将 time_point 设置为某些用户提供的持续时间?
我觉得你的解决方案很不错。然而,它可以稍微简化。没有必要形成 nanoseconds-precision period
。可以直接用seconds
:
操作
const auto floored = now - (now.time_since_epoch() % seconds);
我有一个用户提供的持续时间
const int period_seconds = cfg.period_seconds;
我想 floor
一个 time_point
到那个 duration
的粒度。
我看到 time_point
and duration
有一个 std::chrono::floor
函数,但是如何使用它们来完成我正在寻找的事情并不是很明显。
我有以下有效的玩具示例:
const auto seconds = std::chrono::seconds{period_seconds};
const auto period = std::chrono::duration_cast<std::chrono::nanoseconds>(seconds);
const auto now = std::chrono::system_clock::now();
const auto floored = now - (now.time_since_epoch() % period);
以上代码的净效果,持续 10 秒如下:
now: 2022-04-19 15:06:26.781772408 floored: 2022-04-19 15:06:20.000000000 # so "floors" the 25.78 seconds to 20 seconds
我忍不住觉得根据 time_since_epoch
和模数运算符工作并不是获得我正在寻找的结果的“正确”方式...
是否有“更好的”/推荐的方法来将 time_point 设置为某些用户提供的持续时间?
我觉得你的解决方案很不错。然而,它可以稍微简化。没有必要形成 nanoseconds-precision period
。可以直接用seconds
:
const auto floored = now - (now.time_since_epoch() % seconds);