Потолочное время - точка времени, определяемая продолжительностью

У меня потолок time_point до следующих полных пяти минут, что довольно просто:

template <int N>
    using minutes = std::chrono::duration<int, std::ratio_multiply<std::ratio<N>, std::chrono::minutes::period>>;

const auto now = std::chrono::system_clock::now();
const auto begin = ceil<minutes<5>>(now);

Я не знаю, как установить количество минут во время выполнения.

1 ответ

Вот ceil функция, которая займет любое time_point и округлить до следующего Duration m, давая результат точности Duration{1}:

template <class Clock, class Duration1, class Duration2>
constexpr
auto
ceil(std::chrono::time_point<Clock, Duration1> t, Duration2 m) noexcept
{
    using R = std::chrono::time_point<Clock, Duration2>;
    auto r = std::chrono::time_point_cast<Duration2>(R{} + (t - R{})/m*m);
    if (r < t)
        r += m;
    return r;
}

Может использоваться как:

const auto begin = ceil(system_clock::now(), 5min);
const auto begin = ceil(system_clock::now(), 10min);
const auto begin = ceil(system_clock::now(), 10ms);
  1. Сначала вычисляется тип возвращаемого значения и ему присваивается псевдоним R,
  2. Тогда time_pointt усекается до durationm (к нулю).
  3. Если усеченный результат меньше входного, результат округляется до следующего m,

Если 24 часа не делятся поровну m, результат может быть нелогичным.

Другие вопросы по тегам