我有一个函数,它接受秒作为参数并返回HH:MM:SS格式的字符串。如果没有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中看到了Howard Hinnant的优秀视频教程。不幸的是,没有这种情况的示例。
一旦使用C ++ 20实现,您将可以执行以下操作(未经测试的代码):
std::chrono::hh_mm_ss<std::chrono::seconds> tod{std::chrono::seconds(secs)};
std::cout << tod;
请参阅time.hms.overview了解更多信息。
使用Howard Hinnant's header-only date.h library看起来像这样:
#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);
}