簡介
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類型轉化為時間點
實例:獲取當前日期

#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; }
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; }
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分鍾