目錄
1、chrono
時間處理的庫。
2、duration時段
時段,時間週期,同單位:毫秒,秒,分等。
2.1 函數
duration d; 默認構造
duration d(d2); 複製構造,(單位可能不同)
duration d(val); 以d的單位類型建立一個duration,擁有val tick
d = d2; 賦值
d.count(); 返回d的值數量
duration_cast<D> (d); 返回將d轉爲D類型的結果
duration::zero(); 獲得長度爲0的duration
duration::max(); 獲得此類型之最大可能的duration
duration::min(); 獲得此類型之最小可能的duration
duration::rep; 獲取單位
duration::period; 獲取單位類型的類型
2.2 測試
#include <iostream>
#include <chrono>
using namespace std;
int main()
{
/*
typedef duration <Rep, ratio<1,1000000000>> nanoseconds 納秒
typedef duration <Rep, ratio<1,1000000>> microseconds 微妙
typedef duration <Rep, ratio<1,1000>> milliseconds 毫秒
typedef duration <Rep, ratio<1,1>> seconds 秒
typedef duration <Rep, ratio<60,1>> minutes 分
typedef duration <Rep, ratio<3600,1>> hours 小時
*/
//時段,支持加減乘除
chrono::seconds sec(10);
chrono::minutes min(3);
cout << sec.count() << endl;
cout << min.count() << endl;
cout << (sec + min).count() << endl;
cout << chrono::milliseconds(sec + min).count() << endl;
//將秒轉爲分
cout << chrono::duration_cast<chrono::minutes>(sec).count() << endl;
cout << sec.max().count() << endl;
cout << sec.min().count() << endl;
cout << sec.zero().count() << endl;
system("pause");
}
3、時鐘 clock
定義一個起點epoch和一個tick(例如:秒,毫秒)時間週期。
C++標準庫提供的三個時鐘:
1)system_clock:系統時鐘,系統中所有的進程獲取now()時間是一直的。
2)steady_clock:穩定的時間間隔,後一次獲取的時間總比前一次大,修改系統時間,不受影響。
3)high_resolution_clock:高精度時鐘。
3.1 函數:
三種時間,均有以下成員函數。
clock::duration; 獲取時段(單位)屬性
clock::rep; 獲取單位數目(?)
clock::period; 獲取單位類型
clock::time_point; 獲取時間點類型
clock::is_steady; 如果時間是穩定的 返回true
clock::now(); 返回當前時間,類型爲time_point
3.2 測試:
#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
template <typename C>
void printClockData()
{
cout << "--Print clock data." << ends;
typedef typename C::period P; //獲取時間類型
if ( ratio_less_equal<P,milli>::value) //比較 類型精度是否<=毫秒
{
typedef typename ratio_multiply<P, kilo>::type T;
cout << fixed << double(T::num) / T::den << " milliseconds" << endl;
}
else
{
cout << fixed << double(P::num) / P::den << " seconds" << endl;
}
//時間是否是穩定時間
cout << "--is_steady " << boolalpha << C::is_steady << endl;
}
int main()
{
cout << "system_clock " << endl;
printClockData<chrono::system_clock>();
cout << "high_resolution_clock: " << endl;
printClockData<chrono::high_resolution_clock>();
cout << "steady_clock: " << endl;
printClockData<chrono::steady_clock>();
//獲取當前時間
auto system_start = chrono::system_clock::now();
//判斷,時間是否流逝了1分鐘
if (chrono::system_clock::now() > system_start + chrono::minutes(1));
{
cout << " timeout one minute." << endl;
}
//計算時間流逝,並將其轉爲秒爲單位的值
auto diff = chrono::system_clock::now() - system_start;
auto sec = chrono::duration_cast<chrono::seconds>(diff);
cout << " runtime : " << sec.count() << endl;
{ //chrono::system_clock與time_t相互轉換
//time_point表示具體時間,
chrono::system_clock::time_point tNow = chrono::system_clock::now();
time_t tOldTime = time(0);
cout << " tOldTime " << tOldTime << endl;
//將 chrono::system_clock::time_point 轉爲 time_t
time_t tNewTimeo = chrono::system_clock::to_time_t(tNow);
cout << " tNewTimeo " << tNewTimeo << endl;
//將time_t 轉爲 chrono::system_clock::time_point
tNow = chrono::system_clock::from_time_t(tNewTimeo);
}
system("pause");
}
4、時間點(timepoint)
4.1 函數
time_point t; 默認構造,時間爲epoch
time_point t(t2); 複製構造
time_point t(duation); 建立epoch+duration時間點的 time_point
time_point_case<C,D>(tp); 將tp轉爲d單位的time_point
支持 +、-、*、/、<、 >、 <=、 >=、 !=、==等判斷
t.time_since_epoch(); 返回duration表示epoch和t之間
min(); 返回第一個可能的time_point
max(); 返回最後一個可能的time_point
4.2 測試
#include <iostream>
#include <chrono>
#include <ctime>
#include <string>
#pragma warning(disable:4996)
using namespace std;
string asString(const chrono::system_clock::time_point &t)
{
time_t tTime = chrono::system_clock::to_time_t(t);
if ( tTime < 0)
{
return " time is bad ";
}
string str = ctime(&tTime);
str.resize(str.size() - 1);
return str;
}
int main()
{
//自定義 單位 天
typedef chrono::duration<int, ratio<3600 * 24>> Day;
//獲取最初時間點
chrono::time_point<chrono::system_clock> t;
//chrono::system_clock::time_point tp; //同上
cout << "epoch " << asString(t) << endl;
//時間點 加減
t += Day(1) + chrono::hours(23) + chrono::minutes(56);
cout << " later " << asString(t) << endl;
//獲得 增長的時段
auto diff = t - chrono::system_clock::time_point();
cout << "diff " << chrono::duration_cast<chrono::minutes>(diff).count()
<< " minutes " << endl;
t = chrono::time_point_cast<Day>(t); //可能會丟失精度
//值超出時間範圍,不能轉爲時間打印
t = chrono::system_clock::time_point::min();
//cout << " min " << asString(t) << endl;
t = chrono::system_clock::time_point::max();
//cout << " max " << asString(t) << endl;
system("pause");
}