我是std::chrono
的新手,我正在寻找一种简单的方法来构建一个string
,其中包含格式为hhh:mm:ss的时间间隔(是的,3小时数字),表示开始时间点和现在之间的差异。
我如何使用steady_clock
来解决这个问题? examples on Cppreference不太适合这个问题。
答案 0 :(得分:7)
如果您发现自己在使用<chrono>
库的单位之间手动应用转换因子,您应该问自己:
为什么我手动转换单位?这不是
<chrono>
应该为我做什么?!
“转换因子”为60,或1000,或100,或其他。如果您在代码中看到它,那么您就是在转换因子错误。
这是sasha.sochka在没有这些转换因子的情况下重写的代码。只是为了说明这种技术的一般性,为耀斑添加毫秒:
#include <chrono>
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
int main() {
using namespace std::chrono;
steady_clock::time_point start;
steady_clock::time_point now = steady_clock::now();
auto d = now -start;
auto hhh = duration_cast<hours>(d);
d -= hhh;
auto mm = duration_cast<minutes>(d);
d -= mm;
auto ss = duration_cast<seconds>(d);
d -= ss;
auto ms = duration_cast<milliseconds>(d);
std::ostringstream stream;
stream << std::setfill('0') << std::setw(3) << hhh.count() << ':' <<
std::setfill('0') << std::setw(2) << mm.count() << ':' <<
std::setfill('0') << std::setw(2) << ss.count() << '.' <<
std::setfill('0') << std::setw(3) << ms.count();
std::string result = stream.str();
std::cout << result << '\n';
}
如果没有公开的转换因子,还有其他方法可以做到这一点,这种方式只是一个例子。我的主要观点是:避免在代码中硬编码单位转换因子。它们容易出错。即使您在第一次编码时正确使用它,转换因子也很容易受到未来代码维护的影响。您可以通过要求所有单位转换都在<chrono>
库中进行来验证您的代码。
答案 1 :(得分:5)
正如Joachim Pileborg在评论中指出的更高,没有函数来格式化来自duration
对象的字符串。但您可以使用duration_cast
将时差首先转换为hours
,然后转换为minutes
和seconds
。
之后使用C ++ 11 to_string
函数,您可以连接它们以获得结果字符串。
#include <chrono>
#include <string>
#include <sstream>
#include <iomanip>
int main() {
using namespace std::chrono;
steady_clock::time_point start = /* Some point in time */;
steady_clock::time_point now = steady_clock::now();
int hhh = duration_cast<hours>(now - start).count();
int mm = duration_cast<minutes>(now - start).count() % 60;
int ss = duration_cast<seconds>(now - start).count() % 60;
std::ostringstream stream;
stream << std::setfill('0') << std::setw(3) << hhh << ':' <<
std::setfill('0') << std::setw(2) << mm << ':' <<
std::setfill('0') << std::setw(2) << ss;
std::string result = stream.str();
}