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