最简单的方法来获取包含时间间隔的字符串

时间:2013-07-30 11:43:39

标签: c++ c++11 chrono

我是std::chrono的新手,我正在寻找一种简单的方法来构建一个string,其中包含格式为hhh:mm:ss的时间间隔(是的,3小时数字),表示开始时间点和现在之间的差异。

我如何使用steady_clock来解决这个问题? examples on Cppreference不太适合这个问题。

2 个答案:

答案 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,然后转换为minutesseconds

之后使用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();

}