Как преобразовать chrono :: секунд в строку в формате ЧЧ: ММ: СС в C ++? - PullRequest
3 голосов
/ 03 февраля 2020

У меня есть функция, которая принимает секунду в качестве аргумента и возвращает строку в формате ЧЧ: ММ: СС. Без std :: chrono я могу реализовать это так:

string myclass::ElapsedTime(long secs) {
  uint32_t hh = secs / 3600;
  uint32_t mm = (secs % 3600) / 60;
  uint32_t ss = (secs % 3600) % 60;
  char timestring[9];
  sprintf(timestring, "%02d:%02d:%02d", hh,mm,ss);
  return string(timestring);
}

Используя std::chrono, я могу преобразовать аргумент в std::chrono::seconds sec {seconds};.

Но как я могу преобразовать его в строку с форматом? Я видел хороший видеоурок от Говарда Хиннанта в https://youtu.be/P32hvk8b13M. К сожалению, для этого случая нет примера.

Ответы [ 2 ]

7 голосов
/ 03 февраля 2020

Использование библиотеки date.h Говарда Хиннанта только для заголовков это выглядит так:

#include "date/date.h"
#include <string>

std::string
ElapsedTime(std::chrono::seconds secs)
{
    return date::format("%T", secs);
}

Если вы хотите написать это самостоятельно, то это будет выглядеть примерно так:

#include <chrono>
#include <string>

std::string
ElapsedTime(std::chrono::seconds secs)
{
    using namespace std;
    using namespace std::chrono;
    bool neg = secs < 0s;
    if (neg)
        secs = -secs;
    auto h = duration_cast<hours>(secs);
    secs -= h;
    auto m = duration_cast<minutes>(secs);
    secs -= m;
    std::string result;
    if (neg)
        result.push_back('-');
    if (h < 10h)
        result.push_back('0');
    result += to_string(h/1h);
    result += ':';
    if (m < 10min)
        result.push_back('0');
    result += to_string(m/1min);
    result += ':';
    if (secs < 10s)
        result.push_back('0');
    result += to_string(secs/1s);
    return result;
}

В C ++ 20 вы можете сказать:

std::string
ElapsedTime(std::chrono::seconds secs)
{
    return std::format("{:%T}", secs);
}
3 голосов
/ 03 февраля 2020

После внедрения C ++ 20 вы сможете выполнить следующее (непроверенный код):

std::chrono::hh_mm_ss<std::chrono::seconds> tod{std::chrono::seconds(secs)};
std::cout << tod;

См. time.hms.overview для получения дополнительной информации.

...