C++日期與時(shí)間 chrono庫介紹及使用教程
一、unix timestamp:時(shí)間戳
定義
時(shí)間戳是計(jì)算中廣泛使用的日期和時(shí)間表示形式。它通過自1970年1月1(Unix 紀(jì)元)00:00:00 UTC以來經(jīng)過的秒數(shù)(秒是毫秒、微妙、納秒的總稱)來測量時(shí)間,沒有因閏秒而進(jìn)行調(diào)整。
二、chrono庫的主要組成
chrono庫是C++11中的一個(gè)標(biāo)準(zhǔn)庫,它提供了一系列與時(shí)間相關(guān)的類和函數(shù),用于表示和處理時(shí)間間隔,時(shí)鐘和時(shí)間點(diǎn),C++20新增Calendar。
chrono庫主要包含了以下四種類型:
2.1 Duration
- Duration(時(shí)間間隔):表示一段時(shí)間的長度,由一個(gè)數(shù)值(以下_Rep數(shù)值類型)和一個(gè)單位(ratio)組成,可以用于表示網(wǎng)絡(luò)時(shí)延、程序執(zhí)行耗時(shí)等
//define in std::chrono namspace /// `chrono::duration` represents a distance between two points in time template<typename _Rep, typename _Period = ratio<1>> class duration; //庫中預(yù)先定義了常用的時(shí)間長度
- count --成員函數(shù) 返回周期的統(tǒng)計(jì)數(shù)值
- std::chrono::duration_cast 類型轉(zhuǎn)換方法
- 例子
std::chrono::seconds d1(100); std::chrono::seconds d2(50); //d1: 100 d2: 50 std::cout << "d1: " << d1.count() << " d2: " << d2.count() << std::endl; std::chrono::seconds d3 = d1 - d2; //同單位基本計(jì)算 std::cout << "d3: " << d3.count() << std::endl; //d3: 50 //std::chrono::duration_cast 使用 std::chrono::milliseconds m = std::chrono::duration_cast<std::chrono::milliseconds>(d1); //100s == 100000ms std::cout << "100s == " << m.count() << "ms" << std::endl; //其他用法,當(dāng)前線程休眠 1s sleep_for 需要加 #include<thread> std::this_thread::sleep_for(std::chrono::seconds(1));
2.2 Clock
- 時(shí)鐘(clock):表示一個(gè)可以測量時(shí)間的設(shè)備,提供了當(dāng)前時(shí)間點(diǎn)(now)和時(shí)間點(diǎn)之間的差值(time_since_epoch)等方法。chrono庫提供了三種時(shí)鐘,分別是:
- 系統(tǒng)時(shí)鐘(system_clock):表示當(dāng)前系統(tǒng)范圍的實(shí)時(shí)日歷時(shí)鐘,通常與系統(tǒng)的鐘同步。它可以用于表示日期和時(shí)間,以及與其他系統(tǒng)交互。
- 穩(wěn)定時(shí)鐘(steady_clock):表示一個(gè)單調(diào)遞增的時(shí)鐘,不受系統(tǒng)時(shí)間的調(diào)整或修改影響。它可以用于測量時(shí)間間隔,以及實(shí)現(xiàn)定時(shí)器和延時(shí)等功能。
- 高分辨率時(shí)鐘(high_resolution_clock):表示一個(gè)具有最高精度的時(shí)鐘,通常是系統(tǒng)時(shí)鐘或穩(wěn)定時(shí)鐘的別名(using high_resolution_clock = system_clock;)。它可以用于測量極短的時(shí)間間隔,以及實(shí)現(xiàn)性能分析等功能。
- now --成員函數(shù),放回當(dāng)前時(shí)鐘的時(shí)間點(diǎn)
2.3 TimePoint
- 時(shí)間點(diǎn)(time_point):表示一個(gè)特定時(shí)刻,由一個(gè)時(shí)鐘和一個(gè)時(shí)間間隔組成。例如,
std::chrono::system_clock::now()
表示系統(tǒng)時(shí)鐘的當(dāng)前時(shí)間點(diǎn),std::chrono::steady_clock::now()
表示穩(wěn)定時(shí)鐘的當(dāng)前時(shí)間點(diǎn),等等。chrono庫還提供了一些常用的時(shí)間點(diǎn)別名,如std::chrono::system_clock::time_point
,std::chrono::steady_clock::time_point
,std::chrono::high_resolution_clock::time_point
等。 - time_since_epoch 返回到epoch的時(shí)間間隔Duration
2.4 Calendar(c++20)
- 日期類,用來對日期時(shí)間進(jìn)行比較。
using namespace std::chrono_literals; //使用字面量 ""y ""d(C++20) auto ymd1 = 2023y / std::chrono::November / 10d; // 2023-11-10 auto ymd2 = 2023y / std::chrono::September / 10d; // 2023-9-10 if(ymd1 > ymd2) { // ymd1 > ymd2 std::cout << "ymd1 > ymd2" << std::endl; }
三、常見用法
3.1 獲取當(dāng)前系統(tǒng)時(shí)間戳
//獲取系統(tǒng)時(shí)間戳,實(shí)例化系統(tǒng)時(shí)鐘 std::chrono::system_clock clock; std::chrono::system_clock::time_point now = clock.now(); std::chrono::_V2::system_clock::duration d = now.time_since_epoch(); //納秒單位時(shí)間戳 std::cout << "timestamp: " << d.count() << std::endl; //轉(zhuǎn)化為秒單位 std::chrono::seconds t = std::chrono::duration_cast<std::chrono::seconds>(d); std::cout << "sec: " << t.count() << std::endl; //簡化寫法 // std::chrono::system_clock clock; // auto t = std::chrono::duration_cast<std::chrono::seconds>( // clock.now().time_since_epoch()).count(); // std::cout << "sec: " << t << std::endl;
3.2 計(jì)算時(shí)間間隔
const auto start = std::chrono::high_resolution_clock::now(); //do something std::this_thread::sleep_for(std::chrono::seconds(1)); const auto end = std::chrono::high_resolution_clock::now(); auto duration = start - end; //1000118000ns 1000ms 1s std::cout << duration.count() << "ns " << std::chrono::duration_cast<std::chrono::milliseconds>(duration).count()<< "ms " << std::chrono::duration_cast<std::chrono::seconds>(duration).count() << "s " << std::endl;
3.3 格式化輸出
auto now = std::chrono::system_clock::now(); std::time_t now_c = std::chrono::system_clock::to_time_t(now); //cur time Thu Nov 9 23:42:38 2023 std::cout << "cur time " << std::ctime(&now_c) << std::endl; //或者轉(zhuǎn)化為當(dāng)?shù)貢r(shí)間 //自定義格式輸出 tm * t = std::localtime(&now_c); char buffer[80]; std::strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", t); //cur time: 2023-11-09 23:42:38 std::cout << "cur time: " << buffer << std::endl;
3.4 字面量使用
//使用字面量 c++20 ""y ""d c++11 支持 ""h ""min ""s ""ms ""us using namespace std::chrono_literals;//在此空間定義字面量 auto s = 60s; // 相當(dāng)于std::chrno::seconds(60) std::cout << "sec: " << s.count() << std::endl; auto min = 1min; // 相當(dāng)于std::chrono::minutes(1): std::cout << "min: " << min.count() << std::endl;
到此這篇關(guān)于C++日期與時(shí)間 chrono庫介紹及使用的文章就介紹到這了,更多相關(guān)C++日期與時(shí)間chrono庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C/C++時(shí)間庫chrono的使用總結(jié)
- 深入理解C++中std::chrono庫的使用
- 關(guān)于C++使用std::chrono獲取當(dāng)前秒級/毫秒級/微秒級/納秒級時(shí)間戳問題
- c++11 chrono全面解析(最高可達(dá)納秒級別的精度)
- C++11中的時(shí)間庫std::chrono(引發(fā)關(guān)于時(shí)間的思考)
- C++中Boost.Chrono時(shí)間庫的使用方法
- C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例
- C++實(shí)現(xiàn)統(tǒng)計(jì)代碼運(yùn)行時(shí)間計(jì)時(shí)器的簡單實(shí)例
- C++11計(jì)時(shí)器之chrono庫簡介
相關(guān)文章
C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(單鏈表)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01一文詳解matlab實(shí)現(xiàn)形態(tài)學(xué)圖像處理
這篇文章主要為大家介紹了matlab實(shí)現(xiàn)形態(tài)學(xué)圖像處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)
本文主要介紹了C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08VSCODE調(diào)試RDKit內(nèi)核的方法步驟(C++)
本文主要介紹了VSCODE調(diào)試RDKit內(nèi)核的方法步驟,這個(gè)過程可以分為三個(gè)部分:安裝 RDKit 所需環(huán)境,安裝 VSCode 相應(yīng)插件, 寫調(diào)試代碼編譯,感興趣的可以了解一下2021-08-08