c++ chrono:處理時間的類

1. 用std::chrono::duration表示一段時間。

duration的定義方式

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

第一個參數(shù)int表示用類型保存時間間隔,第二個參數(shù)ratio<60>是個有理數(shù),表示一個時間間隔等于多少秒。這里一分鐘就定義為60秒。庫里面定義了常用的類型,毫秒,秒,小時等等。

定義一個心跳的duration,然后不同的duration可以互相換算

定義心跳的duration: using heartbeats = std::chrono::duration < int, std::ratio < 3, 4 >>;std::ratio < 3, 4 >表示每四分之三秒跳一次。
定義一個用浮點計數(shù)的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可以是負數(shù):std::chrono::seconds s(-10);
兩個duration可以加減,結果是共同的類型,秒。秒可以表示分 cout << (m + s).count();
duration可以乘除一個數(shù)字,結果還是duration;s *= 3;
duration可以除和%另外一個duration,返回一個數(shù)值. 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,系統(tǒng)時鐘,用來處理真實的時間的,可是和time_t類型互相轉換。

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

steady_clock 是穩(wěn)定的時鐘,用來計算時間間隔的。

system_clock不適合來計算時間間隔,因為系統(tǒng)時間可以改變的。
steady_clock::period是個有理數(shù),表示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沒本質區(qū)別,也許和stead_clock是一樣的實現(xiàn)。

3. Time points表示具體的某個時間點。

time_point類用兩個參數(shù)組成,Clock和Duration。
比如steady_clock::time_point的定義就是typedef chrono::time_point<system_clock> time_point;。這里模板參數(shù)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是線程不安全的??梢钥紤]使用非標準函數(shù)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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 接著上節(jié) atomic,本節(jié)主要介紹condition_varible的內容,練習代碼地址。本文參考http://...
    jorion閱讀 8,651評論 0 7
  • 接著上節(jié) condition_varible ,本節(jié)主要介紹future的內容,練習代碼地址。本文參考http:/...
    jorion閱讀 15,056評論 1 5
  • <condition_variable > 頭文件主要包含了與條件變量相關的類和函數(shù)。相關的類包括 std::co...
    張霸天閱讀 3,892評論 1 0
  • 本文根據眾多互聯(lián)網博客內容整理后形成,引用內容的版權歸原始作者所有,僅限于學習研究使用,不得用于任何商業(yè)用途。 這...
    深紅的眼眸閱讀 8,351評論 0 3
  • 接著上上節(jié) thread ,本節(jié)主要介紹mutex的內容,練習代碼地址。<mutex>:該頭文件主要聲明了與互斥量...
    jorion閱讀 12,696評論 2 4

友情鏈接更多精彩內容