美文网首页
c++ chrono:处理时间的类

c++ chrono:处理时间的类

作者: Roland | 来源:发表于2015-06-20 21:51 被阅读0次

    1. 用std::chrono::duration表示一段时间。

    duration的定义方式

    typedef duration<long long> seconds;
    typedef duration<int, ratio<60> > minutes;
    

    第一个参数int表示用类型保存时间间隔,第二个参数ratio<60>是个有理数,表示一个时间间隔等于多少秒。这里一分钟就定义为60秒。库里面定义了常用的类型,毫秒,秒,小时等等。

    定义一个心跳的duration,然后不同的duration可以互相换算

    定义心跳的duration: using heartbeats = std::chrono::duration < int, std::ratio < 3, 4 >>;std::ratio < 3, 4 >表示每四分之三秒跳一次。
    定义一个用浮点计数的minutes类型,计算跳动123次等于多少分钟。

        using minutes = std::chrono::duration<double, ratio<60> >;
        heartbeats beat(123);
        cout << minutes(beat).count() << endl;
    

    计算每小时跳动多少次,std::chrono::hours为标准库预定义好的类型。

        std::chrono::hours hour(1);
        cout << heartbeats(hour).count() << endl;
    

    duration的计算。

        std::chrono::seconds s(10);
        std::chrono::minutes m(2);
    

    duration可以是负数:std::chrono::seconds s(-10);
    两个duration可以加减,结果是共同的类型,秒。秒可以表示分 cout << (m + s).count();
    duration可以乘除一个数字,结果还是duration;s *= 3;
    duration可以除和%另外一个duration,返回一个数值. cout << m / s;。等同于2分钟包含多少个10秒钟。

        using namespace std::chrono;
        seconds sec(10);
        minutes minu(-2);
        sec += minu;
    

    定义一个十秒的duration: std::chrono::seconds sec(10);

    C++14,chrono literals。方便的表示时间。

        using namespace std::chrono_literals;
        auto day = 24h;
        auto halfhour = 0.5h;
    

    2. Clock记时的方法,由一个时钟起点和计时单位组成。

    system_clock,系统时钟,用来处理真实的时间的,可是和time_t类型互相转换。

        system_clock::time_point today = system_clock::now();
        system_clock::time_point tomorrow = today + hours(24);
    

    steady_clock 是稳定的时钟,用来计算时间间隔的。

    system_clock不适合来计算时间间隔,因为系统时间可以改变的。
    steady_clock::period是个有理数,表示steady_clock计时最短时间间隔,单位为秒。这里打印出来的是1和10000000,也就是1/10,000,000之一秒,100 nano seconds。

     cout << steady_clock::period::num << endl;
     cout << steady_clock::period::den << endl;
    

    end - start的结果是duration类型,elapsed.count()可以等同理解为经过了多少100 nano seconds.

        steady_clock::time_point start = steady_clock::now();
        std::this_thread::sleep_for(std::chrono::seconds(2));
        steady_clock::time_point end = steady_clock::now();
        
        auto elapsed = end - start;
        cout << endl << elapsed.count() << endl;
        cout << duration<double>(elapsed).count() << endl; // converts to seconds
    

    high_resolution_clock 高精度时钟

    和steady_clock没本质区别,也许和stead_clock是一样的实现。

    3. Time points表示具体的某个时间点。

    time_point类用两个参数组成,Clock和Duration。
    比如steady_clock::time_point的定义就是typedef chrono::time_point<system_clock> time_point;。这里模板参数Duration省略了,使用了默认的值typename _Clock::duration
    Time point可以互相比较大小,可以和duration做加减运算得到一个新的Time point.

    system_clock::time_point tomorrow = system_clock::now() + hours(24);
    

    4. 用std::get_time和std::put_time处理时间和字符串。

        using namespace std::chrono;
        auto now = system_clock::now();
        time_t t = system_clock::to_time_t(now);
        std::tm tm = *std::localtime(&t);
        auto time = std::put_time(&tm, "%b %d %Y %H:%M:%S");
    

    std::localtime返回的指针不需要delete。因为它指向的是某个static对象,所以localtime是线程不安全的。可以考虑使用非标准函数localtime_s
    put_time可以把std::tm变成一个特殊的对象。这个对象可以根据不同的场景转换成需要的对象。

        std::cout << time << std::endl;
        std::stringstream ss;
        ss << time;
    

    利用std::get_time可以把string变回system_clock

    ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");
    auto now2 = std::chrono::system_clock::from_time_t(std::mktime(&tm));
    

    可以看到两次转换以后,损失了小于一秒的部分。

        duration<double> diff = now - now2;
        std::cout << diff.count() << std::endl;
    

    Jun 20 2015 22:47:20
    0.713123

    相关文章

      网友评论

          本文标题:c++ chrono:处理时间的类

          本文链接:https://www.haomeiwen.com/subject/ubysqttx.html