C++中關於時間的頭文件chrono


參考鏈接

簡介

chrono頭文件是C++中用於解決關於時間問題的頭文件,他主要由三個概念來實現。

一.時鍾(Clocks)

時鍾是將時間點和物理上的時間關聯起來的框架。在這個庫文件里,提供了3個時鍾。分別是系統時鍾(system_clock),穩定時鍾(steady_clock)和高精度時鍾( high_resolution_clock) 。

1.系統時鍾

通過這個類可以獲取現在的系統時間,他有以下三個靜態函數

chrono::system_clock::now  //獲取當前時間點(time_point)
chrono::system_clock::to_time_t  //將時間點轉換為time_t類型
chrono::system_clock::from_time_t //將time_t類型轉化為時間點
code

實例:獲取當前日期

#include<iostream>
#include<ctime>
#include<chrono>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    auto now = chrono::system_clock::now();
    auto tmp = chrono::system_clock::to_time_t(now);
    cout<<ctime(&tmp)<<endl; //Thu Apr 09 21:48:26 2020
    return 0;
}
View Code
2.穩定時鍾

這個時鍾一般用來計算時間差,如代碼運行時間。

實例:

#include<iostream>
#include<ctime>
#include<chrono>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    auto st = chrono::steady_clock::now();
    for(int i=0;i<1e6;i++)
        int tmp;
    auto ed = chrono::steady_clock::now();
    auto cost =  chrono::duration_cast<chrono::duration<double>> (ed-st); //默認是微妙,將其轉化為秒
    cout<<cost.count()<<'s'<<endl;
    return 0;
}
View Code
3.高精度時鍾

其內部時間刻度比其他兩個時鍾更短,精確度更高。

二.時間點(time_point)

用於表示一個相對於時鍾紀元(1970年1月1日0時0分0秒)的時間點

三.時間間隔(duration)

 表示時間間隔,如1秒,1天等,這里是他的一些別名

相互之間的聯系

時間間隔(duration)代表着兩個時間點(time_point)之差。只有在同一個時鍾下的時間間隔才有意義。

如何使用時間間隔(duration)

duration的構造函數

  • duration()
  • duration (const duration& dtn);
  • template<class Rep2, class Period2>
    constexpr duration (const duration<Rep2,Period2>& dtn);

  • template<class Rep2>
    constexpr explicit duration (const Rep2& n);

類模板參數中的Rep2指的是數據類型如int等,用於表示間隔差的數據類型,Period2指間隔周期與1s的比值,1s可以用ratio<1,1>表示,1小時可以用ratio<3600,1>表示

chrono::hours hour(10); //聲明10個小時的時間間隔
chrono::duration<int64_t,ratio<3600,1>> h(10); //聲明10個小時的時間間隔

時間間隔之間的單位轉化

chrono::duration<long long,ratio<1,1>> s(60);
auto res = chrono::duration_cast<chrono::minutes>(s); //將其轉化為以分鍾為單位
cout<<res.count()<<endl;  // 1

如何使用時間點(time_point)

構造函數

  •  time_point();
  • template <class Duration2>
    time_point (const time_point<clock,Duration2>& tp);

  • explicit time_point (const duration& dtn);

構造一個使用系統時鍾的時間點

chrono::time_point<chrono::system_clock,chrono::seconds> tp1(chrono::seconds(50)); // 相對於1970.01.01.00.00.00增加了50秒
auto time = chrono::system_clock::to_time_t(tp1); // 將時間點轉化為time_t類型
cout<<ctime(&time)<<endl; // Thu Jan 01 08:00:50 1970 由於我們時區是UTC+8,所以結果會增加8小時

計算兩個時間點的差值

chrono::time_point<chrono::system_clock,chrono::minutes> tp1(chrono::minutes(50)); //
chrono::time_point<chrono::system_clock,chrono::hours> tp2(chrono::hours(1));
auto res = tp2-tp1;
cout<<res.count()<<endl;  // 10分鍾

 


免責聲明!

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



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