日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

std::chrono时间库详解

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 std::chrono时间库详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主要時間類型

std::ratio<num, den> 定義分式(std::ratio模板請參考《C++新標準之std::ratio》),例如:

std::ratio<60, 1> minutes;//<分子,分母>一分鐘60秒std::ratio<60 * 60> hource;//1小時3600秒std::ratio<1, 1000> milliseconds; //1ms是1/1000秒

chrono命名空間定義好的時間單位

typedef duration <Rep, ratio<3600,1>> hours;typedef duration <Rep, ratio<60,1>> minutes;typedef duration <Rep, ratio<1,1>> seconds;typedef duration <Rep, ratio<1,1000>> milliseconds;typedef duration <Rep, ratio<1,1000000>> microseconds;typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
  • 使用舉例:
chrono::minutes mintu{2};//2分鐘chrono::seconds sec{3};//3秒鐘chrono::milliseconds mills{500};//500毫秒auto dul = sec - mills;//兩者差值,單位默認轉到更小的 2500msdul.count(); //值為2500std::this_thread::sleep_for(std::chrono::milliseconds(100)); //當前線程休眠100毫秒
  • chrono::duration_cast<>() 時間單位轉換
chrono::duration_cast<chrono::seconds>(mintu).count(); //2分鐘換算為120秒

獲取當前時間

time_point 表示一個時間點

  • 獲取當前時間
chrono::system_clock::time_point now = chrono::system_clock::now();//當前時間time_point格式std::time_t oldTime = time(nullptr);//c函數獲取當前時間cout << "oldTime = " << oldTime << endl;chrono::system_clock::time_point timePoint = chrono::system_clock::now();//stl庫獲取當前時間std::time_t newTime = chrono::system_clock::to_time_t(timePoint);//轉換為舊式接口,單位:秒cout<<"newTime = " << newTime <<endl;// oldTime == timeT
  • 格式化打印當前時間
/* chrono::system_clock::time_point與std::time_t類型可相互函數* chrono::system_clock::to_time_t() * chrono::system_clock::from_time_t() */ std::time_t nowTime = chrono::system_clock::to_time_t(now);//轉換為 std::time_t 格式 std::put_time(std::localtime(&nowTime), "%Y-%m-%d %X"); // 2019-06-18 14:25:56

std::put_time用法請參考《std::put_time》

  • std::localtime非線程安全,使用localtime_r函數代替
struct tm cutTm = {0}; std::put_time(localtime_r(&nowTime, &cutTm), "%Y-%m-%d %X");// 2019-06-18 14:25:56

打印程序執行耗時

/** 打印耗時,取變量構造函數與析構函數的時間差,單位ms*/ class SpendTime { public:SpendTime():_curTimePoint(std::chrono::steady_clock::now()){}~SpendTime(){auto curTime = std::chrono::steady_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(curTime - _curTimePoint);cout<<"SpendTime = "<< duration.count() <<"ms"<<endl;}private:std::chrono::steady_clock::time_point _curTimePoint; }; #include <ctime> #include <limits>/** 測量時間流逝* 精度依賴于操作系統或編譯器,具體依賴于std::clock()的返回值精度及CLOCKS_PER_SEC值的定義*/ class Timer { public:Timer() : _startTime(std::clock()){}void Restart(){_startTime = std::clock();}/** 構造函數至今的耗時,單位s*/double Elapsed() const{return double(std::clock() - _startTime) / CLOCKS_PER_SEC;}/** 最小度量,以秒為單位*/double ElapsedMin() const{return double(1) / double(CLOCKS_PER_SEC);}/** 最大度量,以秒為單位*/double ElapsedMax() const{return (double(std::numeric_limits<std::clock_t>::max()) - double(_startTime) / double(CLOCKS_PER_SEC));}private:std::clock_t _startTime;//毫秒級精度 };

判斷時間戳是否為當天

#include <iomanip> #include <thread> #include <mutex> #include <iomanip> #include <chrono> #include <time.h>/** 判斷是否是當天,時區問題內部已考慮* @param timeStamp 當前時間戳(單位s)* @return 0 今天* >0 過去幾天* <0 將來幾天*/ int checkTimestamp(const std::time_t timeStamp) {static std::time_t sLastTimestamp = 0;if (sLastTimestamp == 0) {static std::once_flag oc;std::call_once(oc, [&](){tzset();//刷新時區sLastTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());});}const int lastDay = (sLastTimestamp - timezone)/86400;//轉換到當前時區,自1970年來的天數const int curDay = (timeStamp - timezone)/86400;sLastTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());return (curDay - lastDay); }

?

總結

以上是生活随笔為你收集整理的std::chrono时间库详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。