C++时间函数归纳
C++时间函数笔记
- 前言
- 一、使用c的时间库函数(c++版本)
- 二、使用c++11的库函数 std::chrono
- 总结
前言
发现项目中经常会用到时间相关的内容,但是网上关于时间函数的讲述很乱(主要代码比较乱),这里一点那里一点,于是我准备把c++关于时间函数的用法做一个简单的汇总,方便以后的使用
一、使用c的时间库函数(c++版本)
使用了c库函数版本的时间函数,做了一些代码示范,包括了时间格式和时间戳之间的相互转换
include <iostream>
#include
#include
#include
using 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的格式限制,只能精确到stime_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::chrono
c++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
#include
using 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<chrono::milliseconds>(tp.time_since_epoch()); //同理 微秒cschrono::microseconds cs = chrono::duration_cast<chrono::microseconds>(tp.time_since_epoch());//纳秒 uschrono::nanoseconds us = chrono::duration_cast<chrono::nanoseconds>(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
#include using namespace std;
using namespace std::chrono;int main()
{auto begin = chrono::duration_cast<chrono::milliseconds>(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<chrono::milliseconds>(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的升级版,其实用法没什么区别,只是精度更高而已。
总结
对一些常见的时间函数做了归纳和举例,方便日后使用
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
