C++11時間日期庫chrono的使用
chrono是C++11中新加入的時間日期操作庫,可以方便地進(jìn)行時間日期操作,主要包含了:duration, time_point, clock。
時鐘與時間點(diǎn)
chrono中用time_point模板類表示時間點(diǎn),其支持基本算術(shù)操作;不同時鐘clock分別返回其對應(yīng)類型的時間點(diǎn)。
clock
時鐘是從一個時點(diǎn)開始,按照某個刻度的計(jì)數(shù);chrono同時提供了三種時鐘(通過now()獲取當(dāng)前時間點(diǎn)):
- system_clock:系統(tǒng)時鐘,相對epoch(1970-01-01 00:00:00UTC)的時間間隔;
- steady_clock:單調(diào)時鐘,只能增長(后一次調(diào)用now()得到的時間總是比前一次的值大);一般是相對于系統(tǒng)啟動時間的時間間隔;
- high_resolution_clock:高精度時鐘(當(dāng)前系統(tǒng)能提供的最高精度時鐘,很可能就是steady_clock),也是單調(diào)的;
需要得到絕對時點(diǎn)的場景使用system_clock;需要得到時間間隔,且不受系統(tǒng)時間修改而受影響時使用steady_clock。
時間顯示
在C++20中直接有to_stream直接輸出system_clock時鐘;但在此之前,只能通過間接的方式來輸出:
auto tNow = system_clock::now(); auto tmNow = system_clock::to_time_t(tNow); auto locNow = std::localtime(&tmNow); cout<<std::put_time(locNow, "%Y-%m-%d %H:%M:%S")<<endl; // 2019-12-20 19:35:12
system_clock::from_time_t(...)可以把time_t類型時間轉(zhuǎn)換為time_point,便于chrono使用。
運(yùn)行計(jì)時
通過steady_clock/high_resolution_clock可方便的進(jìn)行計(jì)時:
public:
? explicit XRunTime{bool bStart){
? ? if(bStart) Restart();
? }
? void Restart(){
? ? m_tpStart = high_resolution_clock::now();
? }
? double Stop(){
? ? return operator()();
? }
? double operator()(void){
? ? auto tpEnd = high_resolution_clock::now();
? ? auto elap = tpEnd - m_tpStart;
? ? return (double)elap.count() / std::nano::den; //返回運(yùn)行的秒數(shù),如1.00345
? }
}時間間隔duration
chrono中使用duration模板類來表示時間間隔,并定義了從小時到納秒的時間間隔。
duration模板
duration使用一個數(shù)值(表示時鐘數(shù))和分?jǐn)?shù)(ratio)來表示具體間隔。支持基本的算術(shù)運(yùn)算,并通過count()獲取具體的時鐘數(shù)。
template<typename _Rep, typename _Period = ratio<1>>
struct duration
{
? typedef _Rep ? rep;
? constexpr _Rep count() const{
? ? return (_MyRep);
? }
? ...
private:
? _Rep ?_MyRep; ?//時鐘計(jì)數(shù)
};基準(zhǔn)是秒,并依次定義了常用的間隔,如:
typedef duration<long long> seconds; typedef duration<long long, milli> milliseconds; typedef duration<long long, ratio<3600>> hours;
不同的時間間隔可以直接進(jìn)行算術(shù)運(yùn)算,如休眠需要毫秒?yún)?shù),我們可以封裝接收秒與毫秒的接口:
void MySleep(int nSec, int nMillSec){
std::chrono::seconds secs(nSec);
std::chrono::milliseconds mills(nMillSec);
std::this_thread::sleep_for(secs+mills);
}
duration_cast
使用duration_cast可以方便的在不同時間單位間進(jìn)行轉(zhuǎn)換,如:
auto sec=seconds(123); auto minu=duration_cast<minutes>(sec); cout<<sec.count()<<","<<minu.count()<<endl; // 123,2
ratio
ratio是一個分?jǐn)?shù)模板類,第一個參數(shù)為分子,第二個參數(shù)為分母;通過靜態(tài)成員可獲?。?/p>
- num:分子
- den:分母
typedef ratio<1, 1000> milli; typedef ratio<1000, 1> kilo; cout<<milli::den<<endl; // 1000
到此這篇關(guān)于C++11時間日期庫chrono的使用的文章就介紹到這了,更多相關(guān)C++11時間日期庫chrono 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于OpenCV實(shí)現(xiàn)的人臉簽到系統(tǒng)源代碼
本文從實(shí)際背景和需求出發(fā),采用人臉識別簽到考勤改變了傳統(tǒng)人工檢驗(yàn)的做法,極大提高了組織效率和辦事能力,這篇文章主要給大家介紹了關(guān)于如何基于OpenCV實(shí)現(xiàn)的人臉簽到系統(tǒng)的相關(guān)資料,需要的朋友可以參考下2024-04-04
C++分析類的對象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
終于到了對象的初始化和清理的最后階段了,在這里分享一個cpp里有多個類時,一個類的對象作為另一個類成員的時候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時機(jī)。還有一個靜態(tài)成員也是經(jīng)??嫉降狞c(diǎn),在這篇博客將會詳解其概念并舉出案例鞏固,讓我們開始2022-05-05
C語言實(shí)現(xiàn)隨機(jī)生成6位數(shù)密碼
這篇文章主要為大家詳細(xì)介紹了如何使用C語言實(shí)現(xiàn)一個簡單而實(shí)用的隨機(jī)密碼生成器,該生成器將生成包含字母、數(shù)字和特殊字符的隨機(jī)密碼,有需要的小伙伴可以參考下2023-11-11
QT實(shí)現(xiàn)制作一個ListView列表的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Qt制作一個ListView,點(diǎn)擊ListView的Item可以用于測試OpenCV的各種效果,感興趣的小伙伴可以了解一下2023-02-02

