• c++11 处理时间和日期


        c++11提供了日期时间相关的库 chrono,通过chrono库可以很方便的处理日期和时间。

    1. 记录时间长度的duration

        template<class Rep, class Period = std::ratio<1,1>>
        class Duration;
        //第一个模板参数Rep是一个数值类型,表示时钟数的类型;第二个模板参数是一个默认模板参数 std::ratio,表示时钟周期。
        template<std::intmax_t Num, std::intmax_t Denom = 1>
        class ratio;
        //ratio表示分子除以分母得到的分数值,单位为秒。如 ratio<2> 表示一个时钟周期为2秒,ratio<1,1000> 表示一个时钟周期为1/1000秒。如有:
        typedef duration <Rep, ratio<3600,1> > hours;
        typedef duration<Rep, ratio<1,1>> seconds;
        typedef duration<Rep, ration<1,1000000>> microseconds;
        通过定义这些常用的时间间隔类型,可以很方便的使用它们,比如线程的休眠:
        std::this_thread::sleep_for(std::chrono::seconds(3));
        std::this_thread::sleep_for(std::chrono::microseconds(3));
    

        duration可以进行运算,如计算两个之差:

        std::chrono::minutes t1(10);
        std::chrono::seconds t2(60);
        std::chrono::seconds t3 = t1 - t2; //只能为 minute向seconds,milliseconds转换,不能反过来
        std::cout << t3.count() << " seconds" << std::endl;
    

        duration的加减运算有一定的规则,当两个duration时钟周期不相同的时候,先统一成一种时钟,然后再做加减运算。统一成一种时钟的规则如下: 
        对于 ration< x1, y1> count1, ration< x2, y2> count2; 如果x1, x2的最大公约数为x; y1, y2的最小公倍数为 y,则统一之后的ration 为 ration< x, y>.

        chrono::duration<int, std::ratio<9, 7>> d1(3);
        std::chrono::duration<int, std::ratio<6, 5>> d2(1);
        auto d3 = d1 - d2;
        cout << typeid(d3).name() << endl;
        cout << d3.count() << endl;
        //得到的d3的 typeid(t3).name()为 std::chrono::duration<double, std::ration<3, 35>>;
    

        duration可以进行不同时钟周期的转换,通过 duration_cast来实现:

        std::chrono::minutes t1(10);
        std::chrono::seconds t2(60);
        std::chrono::milliseconds t3 = t1 -t2;
        std::cout << t3.count() << " milliseconds" << std::endl;
        std::cout << std::chrono::duration_cast<std::chrono::minutes>(t3).count() << " minutes" << std::endl;
        //将秒的时钟周期转换为分钟的时钟周期,然后通过count得到转换后的分钟时钟周期的时间间隔
    

    2. 表示时间点的time point

        time_point表示一个时间点,用来获取从它的clock的纪元开始所经过的duration(比如,可能是 1970.1.1以来的时间间隔)和当前的时间,可以做一些时间的比较和算术运算,可以和ctime库结合起来显示时间。 
        time_point必须使用clock来计时。

        using namespace std::chrono;
        using days_type = duration < int, std::ratio<60 * 60 * 24> > ;
        time_point<system_clock, days_type> today =
        time_point_cast<days_type>(system_clock::now());
        std::cout << today.time_since_epoch().count() << " days since epoch" << endl;
    

        time_point还支持一些算术运算,比如两个 time_point 的差值时钟周期数,还可以和duration 相加减。要注意不同的clock的time_point是不能进行算术运算的。

        system_clock::time_point now = system_clock::now();
        std::time_t last = system_clock::to_time_t(now - hours(24));
        std::time_t next = system_clock::to_time_t(now + hours(24));
        std::cout << "one day ago, time was : " << std::asctime(std::localtime(&last)) << std::endl;
        std::cout << "one day after, time is : " << std::asctime(std::localtime(&next)) << std::endl;
    

    3. 获取系统时钟的clocks

        clocks分为以下三种: 
    (1)system_clock: 代表真实世界的挂钟时间,具体时间值依赖于系统。system_clock保证提供的时间是一个可读的时间。 
    (2)steady_clock: 不能被“调整”的时间,保证先后调用now()得到的时间值不会递减 
    (3)high_resolution_clock: 高精度时间,实际上是system_clock或者steady_clock的别名,可以通过now()来获取当前时间点 
     
        system_clock的to_time_t方法可以将一个time_point转换为ctime, from_time_t 可以将一个ctime转化为time_point:

        std::time_t now_c = std::chrono::system_clock::to_time_t(now);
        std::chrono::time_point<std::chrono::system_clock> tp = std::chrono::system_clock::from_time_t(now_c);
    
  • 相关阅读:
    struts2基础
    hibernate框架基础
    Django的模板层
    HBuilder无法连接夜神模拟器的解决办法
    Django的视图层
    Django的路由层
    Django简介
    http协议
    web应用
    Mongodb之增删改查
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4925557.html
Copyright © 2020-2023  润新知