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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM