您好,登錄后才能下訂單哦!
本篇內容介紹了“C++11中的chrono庫怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
C++11提供了日期時間相關的庫chrono,通過chrono庫可以很方便的處理日期和時間。chrono庫主要包含3種類型:時間間隔duration、時鐘clocks和時間點time_point
duration為一個模板類,表示時間間隔,可以是幾秒、幾分鐘或者幾個小時的時間間隔。duration的原型如下:
template <class Rep, class Period = ratio<1> > class duration;
第一模板參數(shù)Rep是一個數(shù)值類型,表示時鐘數(shù)的類型;第二個模板參數(shù)是一個默認模板參數(shù)std::ratio,表示時鐘周期,它的原型如下:
template <intmax_t N, intmax_t D = 1 > class ratio;
它表示每個時鐘周期的秒數(shù),其中第一個模板參數(shù)N代表分子,D代表分母,分母默認為1,因此,ratio代表的是一個分子除以分母的分數(shù)值。比如:
ratio<2> //代表2秒 ratio<60> //代表1分鐘 ratio<60*60> //代表1小時 ratio<60*60*24> //代表1天 ratio<1, 1000> //代表1毫秒 ratio<1, 1000000> //代表1微秒 ratio<1, 1000000000> //代表1納秒
為了方便使用,標準庫定義了一些常用的時間間隔,如時、分、秒、毫秒、微秒和納秒,在chrono命名空間下,定義如下(vs2013的源碼):
typedef duration<long long, nano> nanoseconds; typedef duration<long long, micro> microseconds; typedef duration<long long, milli> milliseconds; typedef duration<long long> seconds; typedef duration<int, ratio<60> > minutes; typedef duration<int, ratio<3600> > hours;
通過定義這些常用的時間間隔類型,我們能方便的使用它們,比如線程休眠:
//休眠100毫秒 this_thread::sleep_for(std::chrono::duration<int, ratio<1, 100>>(100)); this_thread::sleep_for(std::chrono::microseconds(100));//更簡單 //休眠3秒 this_thread::sleep_for(std::chrono::duration<int>(3)); this_thread::sleep_for(std::chrono::seconds(3));//更簡單
chrono還提供了獲取時間間隔的時鐘周期數(shù)的方法count(),它的基本用法如下:
#include<iostream> #include<chrono> int main() { std::chrono::seconds s(3);//3秒 std::chrono::milliseconds ms = 2 * s;//6000毫秒 std::cout << "3 s duration has " << s.count() << " ticks\n" << "6000 ms duration has " << ms.count() << " ticks\n"; }
執(zhí)行結果:
duration在某些情況下可以進行轉換,例如,當duration的Rep都為整型,且源Period要大于目標Period時或者目標duration的Rep為浮點數(shù)時可以使用傳統(tǒng)類型轉化或者隱式調用其單值構造函數(shù),不必調用duration_cast
int main() { //目標duration的Rep為double std::chrono::milliseconds int_milliseconds(1024); // 1024ms std::chrono::microseconds int_microseconds(1024); // 1024us std::chrono::duration<double> double_seconds; double_seconds = int_microseconds; //1024ms = 1.024s double_seconds = int_milliseconds; //1024us = 0.001024s //當duration的Rep都為整型,且源Period可被目標Period整除時 int_microseconds = int_milliseconds; //ms賦值給us可以,但是us賦值給ms不可 int_milliseconds = std::chrono::seconds(1); //s賦值給ms可以,但是ms賦值給s不可以 //源duration的Rep為double, 目標duration的Rep不為double,不能轉換 //std::chrono::milliseconds t1 = std::chrono::duration<double>(1024); /* * 數(shù)據(jù)會發(fā)生截斷時的轉化 * chrono庫提供了duration之間相互轉化的函數(shù),其定義如下 * template <class ToDuration, class Rep, class Period> * constexpr ToDuration duration_cast(const duration<Rep,Period>& d); */ std::chrono::seconds t1 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::milliseconds(1024)); // 1s = 1024ms(精度損失) std::chrono::seconds t2 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::duration<double>(1.024)); // 1s = 1.024s }
時間間隔之間可以做運算,計算兩端時間間隔的差值的實例如下:
int main() { std::chrono::minutes t1(10); std::chrono::seconds t2(50); std::chrono::seconds t3 = t1 - t2; cout << t3.count() << " second" << endl; }
執(zhí)行結果:
其中,t1代表10分鐘,t2代表50秒,t3則是t1減t2,也就是600-50=550秒。通過調用t3的count()輸出差值550個時鐘周期,因為t3的時鐘周期為1秒,所以t3表示時間間隔為550秒。
值得注意的是,duration的加減運算有一定的規(guī)則,當兩個duration時鐘周期不相同的時候,會先統(tǒng)一成一種時鐘,然后再作加減運算。統(tǒng)一成一種時鐘的規(guī)則如下:
對于ratio<x1, y1>count1和ratio<x2, y2>count2。如果x1、x2的最大公約數(shù)為x,y1、y2的最小公倍數(shù)為y,那么統(tǒng)一之后的ratio為ratio<x, y>
例如:
int main() { std::chrono::duration<double, std::ratio<9, 7>> d1(3); std::chrono::duration<double, std::ratio<6, 5>> d2(1); auto d3 = d1 - d2; cout << "d3類型 : "<<typeid(d3).name() << endl; cout << d3.count() << endl; }
執(zhí)行結果:
根據(jù)前面介紹的規(guī)則,對于9/7和6/5,分子取最大公約數(shù)3,分母取最小公倍數(shù)35,所以,統(tǒng)一之后的duration為std::chrono::duration<double,struct std::ratio<3,35>>。然后再將原來的duration轉換為統(tǒng)一的duration,最后計算的時鐘周期數(shù)為:((9/7)/(3/35)*3)-((6/5)/(3/35)*1),結果為31
time_point表示一個時間點,用來獲取從它的clock的開始所經(jīng)過的duration(比如,可能是1970.1.1以來的時間間隔)和當前時間,可以做一些時間的比較和算術運算,可以喝ctime庫結合起來顯示時間。time_point必須用clock來計時。time_point有一個函數(shù)time_from_eproch()用來獲得1970年1月1日到time_point時間經(jīng)過的duration
time_point是一個類模板,原型如下:
template <class Clock, class Duration = typename Clock::duration> class time_point; template <class Clock, class Duration = typename Clock::duration> class time_point;
第一個模板參數(shù)Clock用來指定所要使用的時鐘(標準庫中有三種時鐘,system_clock,steady_clock和high_resolution_clock)
第二個模板函數(shù)參數(shù)用來表示時間的計量單位(特化的std::chrono::duration<> )
計算當前時間距離1970年1月1日有多少天
#include<iostream> #include<chrono> #include<ratio> using namespace std::chrono; int main() { using days_type = duration<int, std::ratio<60 * 60 * 24>>; time_point<system_clock, days_type> today = time_point_cast<days_type>(system_clock::now()); std::cout << today.time_since_epoch().count() << " days since epoch" << endl; }
執(zhí)行結果:
time_point還支持一些算術運算,比如兩個time_point的差值時鐘周期數(shù),還可以和duration相加減。要注意不同clock的time_point是不能進行算術運算的。下面例子將展示前一天和后一天的日期:
#include<iostream> #include<chrono> #include<iomanip> using namespace std::chrono; int main() { system_clock::time_point now = system_clock::now(); std::time_t prev = system_clock::to_time_t(now - hours(24)); //返回時間戳 std::time_t next = system_clock::to_time_t(now + hours(24)); //返回時間戳 cout << "One day ago, the time was " << std::put_time(std::localtime(&prev), "%Y.%m.%d %H:%M:%S") << endl; cout << "A day later, the time is " << std::put_time(std::localtime(&next), "%Y.%m.%d %H:%M:%S") << endl; }
執(zhí)行結果:
clocks表示當前的系統(tǒng)時鐘,內部有time_point、duration、Rep、Period等信息,主要用來獲取當前時間,以及實現(xiàn)time_t和time_point的相互轉換。clocks包含如下3種時鐘:
-system_clock:代表真實時間的掛鐘時間,具體時間依賴于系統(tǒng)。system_clock保證提供的時間值是一個可讀時間
-steady_clock:不能被“調整” 的時鐘,并不一定代表真實世界的掛鐘時間。保證先后調用now()得到的時間值是不會遞減的
-high_resoulution_clock:高精度時鐘,實際上是system_clock或者steady_clock的別名??梢酝ㄟ^now()來獲取當前時間點,代碼如下:
int main() { std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now(); cout << "hello fl" << endl; std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now(); cout << (t2 - t1).count() << " tick count" << endl; return 0; }
執(zhí)行結果:
system_clock的to_time_t方法可以將一個time_point轉換為ctime:
std::time_t now_c = std::chrono::system_clock::to_time_t(time_point);
而from_time_t方法則正好相反,它將ctime轉換為time_point
steady_clock可以獲取穩(wěn)定可靠的時間間隔,后一次調用now()的值和前一次的差值不會因為修改了系統(tǒng)時間而改變,從而保證了穩(wěn)定的時間間隔。steady_clock的用法和system用法一樣。
“C++11中的chrono庫怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。