以下整理自:https://www.2cto.com/kf/201404/290706.html
chrono 庫主要包含了三種類型:時間間隔 Duration、時鍾 Clocks 和時間點 Time point
duration:
duration 表示一段時間間隔,用來記錄時間長度,可以表示幾秒鍾、幾分鍾或者幾個小時的時間間隔
duration 的原型是:
template<class Rep, class Period = std::ratio<1>> class duration;
第一個模板參數Rep是一個數值類型,表示時鍾個數;第二個模板參數是一個默認模板參數std::ratio,它的原型是:
template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio;
它表示每個時鍾周期的秒數,其中第一個模板參數 Num 代表分子,Denom 代表分母,分母默認為 1,ratio 代表的是一個分子除以分母的分數值,比如 ratio<2> 代表一個時鍾周期是兩秒,ratio<60> 代表了一分鍾,ratio<60*60> 代表一個小時,ratio<60*60*24> 代表一天。而ratio<1, 1000> 代表的則是1/1000秒即一毫秒,ratio<1, 1000000> 代表一微秒,ratio<1, 1000000000> 代表一納秒。標准庫為了方便使用,就定義了一些常用的時間間隔,如時、分、秒、毫秒、微秒和納秒,在chrono命名空間下,它們的定義如下:

1 typedef duration <Rep, ratio<3600,1>> hours; 2 3 typedef duration <Rep, ratio<60,1>> minutes; 4 5 typedef duration <Rep, ratio<1,1>> seconds; 6 7 typedef duration <Rep, ratio<1,1000>> milliseconds; 8 9 typedef duration <Rep, ratio<1,1000000>> microseconds; 10 11 typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
通過定義這些常用的時間間隔類型,我們能方便的使用它們,比如線程的休眠:
std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒
std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒
chrono 還提供了獲取時間間隔的時鍾周期個數的方法 count()
count 以及 duration 的基本用法:

1 #include <iostream> 2 #include <chrono> 3 using namespace std; 4 5 int main(void) { 6 std::chrono::milliseconds ms{3};//3毫秒 7 8 std::chrono::microseconds us = 2 * ms;//6000微秒 9 10 std::chrono::duration<double, std::ratio<1, 30>> hz(3.5); 11 //hz為3.5個周期時間長度,每個周期為1/30s 12 13 cout << ms.count() << endl;//3 一個周期為1s 14 cout << us.count() << endl;//6000 一個周期為1us 15 cout << hz.count() << endl;//3.5 16 17 return 0; 18 }
時間間隔之間可以做運算,比如下面的例子中計算兩端時間間隔的差值:

1 #include <iostream> 2 #include <chrono> 3 using namespace std; 4 5 int main(void) { 6 std::chrono::minutes t1(10);//10分鍾 7 8 std::chrono::seconds t2( 60 );//60秒 9 10 std::chrono::seconds t3 = t1 - t2; 11 12 //t3 的時間周期為 second 13 std::cout << t3.count() << " second" << std::endl; 14 15 //通過 duration_cast 將時間周期轉化為 minutes 16 cout << chrono::duration_cast<chrono::minutes>(t3).count() << " minutes" << endl; 17 18 // 輸出: 19 // 540 second 20 // 9 minutes 21 22 return 0; 23 }
注意:我們還可以通過duration_cast<>() 來將當前的時鍾周期轉換為其它的時鍾周期,如我可以把秒的時鍾周期轉換為分鍾的時鍾周期,然后通過 count 來獲取轉換后的分鍾時間間隔
time point:
time_point 表示一個時間點,用來獲取 1970.1.1 以來的秒數和當前的時間, 可以做一些時間的比較和算術運算,可以和 ctime 庫結合起來顯示時間。time_point 必須要 clock 來計時,time_point 有一個函數 time_from_eproch() 用來獲得1970年1月1日到 time_point 時間經過的 duration。下面的例子計算當前時間距離1970年1月一日有多少天:

1 #include <iostream> 2 #include <ratio> 3 #include <chrono> 4 using namespace std; 5 6 int main(void) { 7 using namespace std::chrono; 8 typedef duration<int, std::ratio<60 * 60 * 24>> day_type; 9 10 time_point<system_clock, day_type> today = time_point_cast<day_type>(system_clock::now()); 11 cout << today.time_since_epoch().count() << " days since epoch" << endl; 12 13 // 輸出: 14 // 17598 days since epoch 15 16 return 0; 17 }
time_point還支持一些算術元算,比如兩個time_point的差值時鍾周期數,還可以和duration相加減。下面的例子輸出前一天和后一天的日期:

1 #include <iostream> 2 #include <iomanip> 3 #include <ctime> 4 #include <chrono> 5 using namespace std; 6 7 int main(void) { 8 using namespace std::chrono; 9 system_clock::time_point now = system_clock::now();//獲得當前時間 10 11 std::time_t last = system_clock::to_time_t(now - std::chrono::hours(24)); 12 std::time_t next = system_clock::to_time_t(now + std::chrono::hours(24)); 13 14 return 0; 15 }
clocks
表示當前的系統時鍾,內部有 time_point, duration, Rep, Period 等信息,它主要用來獲取當前時間,以及實現 time_t 和 time_point 的相互轉換。Clocks包含三種時鍾:
system_clock:從系統獲取的時鍾;
steady_clock:不能被修改的時鍾;
high_resolution_clock:高精度時鍾,實際上是 system_clock 或者 steady_clock 的別名
可以通過 now() 來獲取當前時間點:

1 #include <iostream> 2 #include <chrono> 3 #include <ratio> 4 using namespace std; 5 6 int main(void) { 7 using namespace std::chrono; 8 9 time_point<system_clock> t1 = system_clock::now(); 10 int cnt = 1e9; 11 while(--cnt); 12 time_point<system_clock> t2 = system_clock::now(); 13 14 cout << (t2 - t1).count() << endl; 15 //通過 duration_cast<>() 將周期轉化為 secondse 16 cout << std::chrono::duration_cast<seconds>( t2-t1 ).count() << endl; 17 18 // 輸出: 19 // 2669897000 20 // 2 21 22 return 0; 23 }
可以利用 high_resolution_clock 來實現一個類似於 boost.timer 的定時器:

1 #include <iostream> 2 #include <chrono> 3 #define ll long long 4 using namespace std; 5 using namespace std::chrono; 6 7 class Timer{ 8 public: 9 Timer() : m_begin(high_resolution_clock::now()) {} 10 //重置當前時間 11 void reset() { 12 m_begin = high_resolution_clock::now(); 13 } 14 15 //默認輸出毫秒 16 ll elapsed() const { 17 return duration_cast<chrono::milliseconds>(high_resolution_clock::now() - m_begin).count(); 18 } 19 20 //微秒 21 ll elapsed_micro() const { 22 return duration_cast<chrono::microseconds>(high_resolution_clock::now() - m_begin).count(); 23 } 24 25 //納秒 26 ll elapsed_nano() const { 27 return duration_cast<chrono::nanoseconds>(high_resolution_clock::now() - m_begin).count(); 28 } 29 30 //秒 31 ll elapsed_seconds() const { 32 return duration_cast<chrono::seconds>(high_resolution_clock::now() - m_begin).count(); 33 } 34 35 //分 36 ll elapsed_minutes() const { 37 return duration_cast<chrono::minutes>(high_resolution_clock::now() - m_begin).count(); 38 } 39 40 //時 41 ll elapsed_hours() const { 42 return duration_cast<chrono::hours>(high_resolution_clock::now() - m_begin).count(); 43 } 44 45 private: 46 time_point<high_resolution_clock> m_begin; 47 48 }; 49 50 void fun(int n) { 51 while(--n); 52 } 53 54 int main(void) { 55 Timer t;//開始記時 56 fun(1e9); 57 cout << t.elapsed_nano() << endl; 58 cout << t.elapsed_micro() << endl; 59 cout << t.elapsed() << endl; 60 cout << t.elapsed_seconds() << endl; 61 cout << t.elapsed_minutes() << endl; 62 cout << t.elapsed_hours() << endl; 63 64 // 輸出: 65 // 2673899000 66 // 2673899 67 // 2674 68 // 2 69 // 0 70 // 0 71 72 return 0; 73 }