用C++ 11打印优雅时间

sen*_*iwa 11 c++ time datetime c++11

这就是我想在C++ 11中做的事情:给定两个时间点(例如计时类)std::chrono::steady_clock::now(),优雅地打印它们的时差,例如:

1 day 4 hours 3 minutes 45 seconds
Run Code Online (Sandbox Code Playgroud)

要么

32 minutes 54 seconds 345 milliseconds
Run Code Online (Sandbox Code Playgroud)

请注意,我对简单使用不感兴趣put_time,因为我想从最重要的单位时间开始打印.我知道,它只是打印差异的解决方案,但它并不漂亮:我正​​在寻找一个优雅的解决方案:)

干杯!

cqd*_*234 5

持续时间可以算术。

#include <chrono>
#include <iostream>
#include <thread>

int main(){
    using namespace std::chrono;
    using day_t = duration<long, std::ratio<3600 * 24>>;
    auto start = system_clock::now();
    std::this_thread::sleep_for(seconds(1));
    auto end = system_clock::now();
    auto dur = end - start;
    auto d = duration_cast<day_t>(dur);
    auto h = duration_cast<hours>(dur -= d);
    auto m = duration_cast<minutes>(dur -= h);
    auto s = duration_cast<seconds>(dur -= m);
    auto ms = duration_cast<seconds>(dur -= s);
    std::cout << d.count() << " days, "
        << h.count() << " hours, "
        << m.count() << " minutes, "
        << s.count() << " seconds, "
        << ms.count() << " milliseconds\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

可能重复:从C ++中的std :: chrono :: time_point提取年/月/日等。


Sim*_*ple 3

template<typename T>
void print_time_diff(std::ostream& out, T prior, T latter)
{
    namespace sc = std::chrono;
    auto diff = sc::duration_cast<sc::milliseconds>(latter - prior).count();
    auto const msecs = diff % 1000;
    diff /= 1000;
    auto const secs = diff % 60;
    diff /= 60;
    auto const mins = diff % 60;
    diff /= 60;
    auto const hours = diff % 24;
    diff /= 24;
    auto const days = diff;

    bool printed_earlier = false;
    if (days >= 1) {
        printed_earlier = true;
        out << days << (1 != days ? " days" : " day") << ' ';
    }
    if (printed_earlier || hours >= 1) {
        printed_earlier = true;
        out << hours << (1 != hours ? " hours" : " hour") << ' ';
    }
    if (printed_earlier || mins >= 1) {
        printed_earlier = true;
        out << mins << (1 != mins ? " minutes" : " minute") << ' ';
    }
    if (printed_earlier || secs >= 1) {
        printed_earlier = true;
        out << secs << (1 != secs ? " seconds" : " second") << ' ';
    }
    if (printed_earlier || msecs >= 1) {
        printed_earlier = true;
        out << msecs << (1 != msecs ? " milliseconds" : " millisecond");
    }
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/bBNHQp