Потолочное время - точка времени, определяемая продолжительностью
У меня потолок 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);
- Сначала вычисляется тип возвращаемого значения и ему присваивается псевдоним
R
, - Тогда
time_point
t
усекается доduration
m
(к нулю). - Если усеченный результат меньше входного, результат округляется до следующего
m
,
Если 24 часа не делятся поровну m
, результат может быть нелогичным.