chrono

目錄

1、chrono

2、duration時段

2.1 函數

2.2 測試

3、時鐘 clock

3.1 函數:

3.2 測試:

4、時間點(timepoint)

4.1 函數

4.2 測試


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");
}

 

發佈了42 篇原創文章 · 獲贊 52 · 訪問量 6568
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章