
發現項目中經常會用到時間相關的內容,但是網上關于時間函數的講述很亂(主要代碼比較亂),這里一點那里一點,于是我準備把c++關于時間函數的用法做一個簡單的匯總,方便以后的使用
使用了c庫函數版本的時間函數,做了一些代碼示范,包括了時間格式和時間戳之間的相互轉換
include#include#include#includeusing namespace std;
time_t StringToDatetimeS(std::string str) //s級轉換
{tm tm_;
int year, month, day, hour, minute, second;
year = stoi((str.substr(0, 4)).c_str());
month = stoi((str.substr(5, 2)).c_str());
day = stoi((str.substr(8, 2)).c_str());
hour = stoi((str.substr(11, 2)).c_str());
minute = stoi((str.substr(14, 2)).c_str());
second = stoi((str.substr(17, 2)).c_str());
tm_.tm_year = year - 1900;
tm_.tm_mon = month - 1;
tm_.tm_mday = day;
tm_.tm_hour = hour;
tm_.tm_min = minute;
tm_.tm_sec = second;
tm_.tm_isdst = 0;
time_t t_ = mktime(&tm_); // 將tm結構體轉換成time_t格式。
return t_;
}
time_t StringToDatetimeMS(std::string str) //ms級轉換
{tm tm_;
int year, month, day, hour, minute, second, msecond;
year = stoi((str.substr(0, 4)).c_str());
month = stoi((str.substr(5, 2)).c_str());
day = stoi((str.substr(8, 2)).c_str());
hour = stoi((str.substr(11, 2)).c_str());
minute = stoi((str.substr(14, 2)).c_str());
second = stoi((str.substr(17, 2)).c_str());
msecond = stoi((str.substr(20, 3)).c_str());
tm_.tm_year = year - 1900;
tm_.tm_mon = month - 1;
tm_.tm_mday = day;
tm_.tm_hour = hour;
tm_.tm_min = minute;
tm_.tm_sec = second;
tm_.tm_isdst = 0;
time_t t_ = mktime(&tm_)*1000+ msecond; // 將tm結構體轉換成time_t格式。
return t_;
}
int main()
{//把當前時間轉換為時間格式 當然由于tm的格式限制,只能精確到s
time_t now = time(NULL);
struct tm tm_t;
localtime_s(&tm_t,&now);
char pTmpString[256] = {0 };
sprintf_s(pTmpString, "%04d-%02d-%02d %02d:%02d:%02d", tm_t.tm_year + 1900, tm_t.tm_mon + 1, tm_t.tm_mday, tm_t.tm_hour, tm_t.tm_min, tm_t.tm_sec);
string str = pTmpString;
cout<< pTmpString<< endl;
//若要精確到ms,可以調用系統的自帶的GetSystemTime,GetLocalTime
//GetSystemTime::獲取的是UTC時間,若要轉換為北京時間,需要hour+8
//GetLocalTime:獲取的北京時間
SYSTEMTIME tm_t2 = {0 };
GetSystemTime(&tm_t2);
char pTmpString2[256] = {0 };
sprintf_s(pTmpString2, "%04d-%02d-%02d %02d:%02d:%02d:%03d", tm_t2.wYear, tm_t2.wMonth, tm_t2.wDay, tm_t2.wHour+8, tm_t2.wMinute, tm_t2.wSecond, tm_t2.wMilliseconds);
string str2 = pTmpString2;
cout<< str2<< endl;
SYSTEMTIME tm_t3 = {0 };
GetLocalTime(&tm_t3);
char pTmpString3[256] = {0 };
sprintf_s(pTmpString3, "%04d-%02d-%02d %02d:%02d:%02d:%03d", tm_t3.wYear, tm_t3.wMonth, tm_t3.wDay, tm_t3.wHour, tm_t3.wMinute, tm_t3.wSecond, tm_t3.wMilliseconds);
string str3 = pTmpString3;
cout<< str3<< endl;
//下面是時間格式轉換為時間戳分別和上面對應 13位的時間戳,其精度是毫秒(ms);10位的時間戳,其精度是秒(s);
//s級別轉換
if (StringToDatetimeS(pTmpString) == now)
{ cout<< "s級別轉換成功!!!"<< endl;
}
//ms轉換加上ms即可StringToDatetimeMS
}
2022-11-29 16:12:40
2022-11-29 16:12:40:317
2022-11-29 16:12:40:317
s級別轉換成功!!!二、使用c++11的庫函數 std::chronoc++11為我們提供了三種時間類型,并且每一種都提供了一個函數now()來獲取當前時間
并且這三個時間類都提供了rep(周期)、period(單位比率)、duration(成員類型)。
system_clock:系統時間。system_clock除了now()函數外,還提供了to_time_t()靜態成員函數。用于將系統時間轉換成熟悉的std::time_t類型,得到了std::time_t類型的值,就可以很方便地打印當前時間了。
steady_clock:是單調的時鐘,相當于教練手中的秒表;只會增長,適合用于記錄程序耗時。
high_resolution_clock:是當前系統能夠提供的最高精度的時鐘;
獲取時間和做時間戳和時間格式的互換用system_clock
#include#include#include#includeusing namespace std;
time_t StringToDatetimeMS(std::string str) //ms級轉換
{tm tm_;
int year, month, day, hour, minute, second, msecond;
year = stoi((str.substr(0, 4)).c_str());
month = stoi((str.substr(5, 2)).c_str());
day = stoi((str.substr(8, 2)).c_str());
hour = stoi((str.substr(11, 2)).c_str());
minute = stoi((str.substr(14, 2)).c_str());
second = stoi((str.substr(17, 2)).c_str());
msecond = stoi((str.substr(20, 3)).c_str());
tm_.tm_year = year - 1900;
tm_.tm_mon = month - 1;
tm_.tm_mday = day;
tm_.tm_hour = hour;
tm_.tm_min = minute;
tm_.tm_sec = second;
tm_.tm_isdst = 0;
time_t t_ = mktime(&tm_) * 1000 + msecond; // 將tm結構體轉換成time_t格式。
return t_;
}
int main()
{//system_clock獲取當前時間(可以獲取各種級別的時間戳)
auto tp = chrono::system_clock::now();
time_t nowtime = chrono::system_clock::to_time_t(tp);
chrono::milliseconds ms = chrono::duration_cast(tp.time_since_epoch());
//同理 微秒cs
chrono::microseconds cs = chrono::duration_cast(tp.time_since_epoch());
//納秒 us
chrono::nanoseconds us = chrono::duration_cast(tp.time_since_epoch());
//轉化為各種日期格式
struct tm tm_t;
localtime_s(&tm_t, &nowtime);
char buffer[128];
strftime(buffer, sizeof(buffer), "%F %T", &tm_t);
std::ostringstream ss;//用于拼接數字和字符串。
ss.fill('0');
cout<< buffer<< endl;
ss<< buffer<< ":"<< (ms % 1000).count(); //%1000表示除去s之后剩余那部分時間
string str1 = ss.str();
cout<< str1<< endl;
ss<< ":"<< ((cs % 1000000).count()) % 1000; //%1000000表示除去s之后剩余那部分時間,需要進一步%1000才是剩余的微秒部分
string str2 = ss.str();
cout<< str2<< endl;
ss<< ":"<< (((us % 1000000000).count()) % 1000)%1000;//%1000000000表示除去s之后剩余那部分時間,需要進一步%1000才是剩余的微秒部分,再%1000就是剩余us部分
string str3 = ss.str();
cout<< str3<< endl;
//把日期格式轉回時間戳,這里沒有直接的轉換函數,用回上述的c版本轉換即可。
//即先轉成tm,再轉成以s為單位的時間戳,剩余部分換算相加即可。這里以
//StringToDatetimeMS為示范
if (StringToDatetimeMS(str1) == ms.count())
{cout<< "ms時間戳轉換成功"<< endl;
}
return 0;
} 2022-11-29 17:59:08
2022-11-29 17:59:08:210
2022-11-29 17:59:08:210:690
2022-11-29 17:59:08:210:690:500
ms時間戳轉換成功//如果是計算程序的耗時,用steady_clock,示例如下
#include#include//表示時間單位的庫
#include#include#includeusing namespace std;
using namespace std::chrono;
int main()
{auto begin = chrono::duration_cast(steady_clock::now().time_since_epoch()); //獲取系統啟動后到現在的時間點,這里強轉可能會有精度損失
for (int i = 0; i< 1; ++i)
{std::this_thread::sleep_for(seconds(1));
std::cout<< i<< std::endl;
}
auto end = chrono::duration_cast(steady_clock::now().time_since_epoch()); //獲取系統啟動后到現在的時間點,這里強轉可能會有精度損失
auto diff = (end - begin).count();
cout<< "diff="<< diff<< std::endl; //單位默認是納秒
return 0;
} 0
diff=1000
這里主要參考下面這篇文章
https://blog.csdn.net/t46414704152abc/article/details/103531447?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166971236216800215045777%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166971236216800215045777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-103531447-null-null.142^v67^control,201^v3^add_ask,213^v2^t3_esquery_v2&utm_term=c%2B%2Bchrono%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E6%97%B6%E9%97%B4&spm=1018.2226.3001.4187至于第三種high_resolution_clock可以看成steady_clock的升級版,其實用法沒什么區別,只是精度更高而已。
總結對一些常見的時間函數做了歸納和舉例,方便日后使用
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
文章名稱:C++時間函數歸納-創新互聯
地址分享:http://www.yijiale78.com/article24/cegdce.html
成都網站建設公司_創新互聯,為您提供網站收錄、微信小程序、網站維護、App設計、網頁設計公司、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯