c++ chrono:處理時間的類

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容