Estou tentando formatar um std::chrono::duration
objeto no formato HH:MM::SS, por exemplo, 16:42:02 sendo as horas (16), os minutos (42) e os segundos (2).
a biblioteca fmt
oferece especificadores de formatação úteis para isso:
using namespace std::chrono;
auto start = high_resolution_clock::now();
auto end = start + 4s;
fmt::print("{:%H:%M:%S} \n", end);
que infelizmente imprime os segundos em decimais
16:58:55.359425076
Quero arredondar para o número inteiro mais próximo, mas não consigo descobrir onde colocar o especificador de precisão (precisão 2 apenas em termos de teste):
fmt::print("{:.2%H:%M:%S} \n", end); // error
fmt::print("{:.2f%H:%M:%S} \n", end); // error
fmt::print("{:%H:%M:.2%S} \n", end); // nonsense: 17:07:.202.454873454
Estou um pouco perdido olhando para os detalhes da especificação do formato do cronômetro...
Um exemplo de explorador de compilador acima está aqui .
Para arredondar para o segundo mais próximo, converta seu ponto no tempo em precisão de segundos usando
round<seconds>(tp)
. Além disso,high_resolution_clock
não tem relação portátil com o calendário. Você precisa usarsystem_clock
em seu lugar. Para o gcc,high_resolution_clock
é um alias de tiposystem_clock
, então funciona por acidente. Mas isso não será compilado usando ferramentas MSVC ou LLVM.Demonstração.
Se desejar outros modos de arredondamento, você também pode usar
floor
ou .ceil