整理c++ chrono时间库常用用法
参考链接:
chrono时间库平时主要用于sleep()操作,计算操作时间间隔,一些标准库的wait()函数(比如future变量的wait_for())的参数等。
chrono库里面主要包括时钟,时间点,时长三个概念。
时钟
- 系统时钟(system_clock)
- 单调时钟(steady_clock)
- 高精度时钟(high_resolution_clock)
系统时钟的一些常用用法
1.获取当前时间。通过system_clock::now()函数可以获取当前的时间点,返回类型是time_point。
2.计算时间差值。通过在某些操作前后分别通过now()函数获取当前时间点,可以计算时间差值。
3.system_clock::to_time_t()函数。将time_point类型的值转换为std::time_t类型。
4.系统时钟可以字符串化,输出日历时间,如2025-03-20 19:05:00。通过成员函数转为time_t类型时间后,通过std::put_time()或std::strftime()可以输出当前日历时间。
#include <iostream>
#include <chrono>
#include <iomanip>
#include <thread>
void printCurrentTime(void)
{
std::chrono::system_clock::time_point sysT = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::seconds>(sysT.time_since_epoch()).count() << std::endl;
auto t1 = std::chrono::system_clock::to_time_t(sysT);
std::cout << std::put_time(std::localtime(&t1), "%Y-%m-%d %H:%M:%S") << std::endl;
char buffer[80];
std::strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", std::localtime(&t1));
std::cout << "use strftime: " << buffer << std::endl;
}
void delayTime(int sec)
{
std::this_thread::sleep_for(std::chrono::seconds(sec));
}
int main()
{
printCurrentTime();
delayTime(5);
printCurrentTime();
std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
delayTime(5);
std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
std::cout << "cost time = " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << std::endl;
return 0;
}
输出结果:
1743154184
2025-03-28 02:29:44
use strftime: 2025-03-28 02:29:44
1743154189
2025-03-28 02:29:49
use strftime: 2025-03-28 02:29:49
cost time = 5000
std::chrono::steady_clock
类 std::chrono::steady_clock 表示单调时钟。即时间纪元一般是程序的启动时间。steady_clock无法转换成日历时间,一般用来测量函数执行时间等。
#include <iostream>
#include <chrono>
#include <iomanip>
#include <thread>
void delayTime(int sec)
{
std::this_thread::sleep_for(std::chrono::seconds(sec));
}
int main()
{
std::chrono::steady_clock::time_point stT1 = std::chrono::steady_clock::now();
delayTime(5);
std::chrono::steady_clock::time_point stT2 = std::chrono::steady_clock::now();
std::cout << "steady clock = " << std::chrono::duration_cast<std::chrono::seconds>(stT2 - stT1).count() << std::endl;
return 0;
}
输出结果:
steady clock = 5
时长(std::chrono::duration)
duration表示时间间隔。可以将其他时钟运算的时间间隔通过duration表示。
平时用的比较多的是成员函数count()和非成员函数duarion_cast()。
1.duration_cast.将时间间隔转为毫秒单位的时间间隔。使用count()函数获取时间间隔的计数。
std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() //时间间隔5s时,返回5000
std::chrono::duration_cast<std::chrono::seconds>(end - start).count() //时间间隔5s时,返回5
时间点(std::chrono::time_point)
类模板 std::chrono::time_point 表示时间中的一个点。它被实现成如同存储一个 Duration 类型的值,存储从该时钟的纪元(Epoch)开始的 Duration 类型的时间间隔。
比较常用的是成员函数time_since_epoch(),返回时钟起点开始的时长表示的时间点。
比如system_clock::time_point的定义如下:
typedef chrono::time_point<system_clock, duration> time_point;
字符串化时间输出
1.std::put_time
使用std::localtime()可以将std::time_t类型转为struct tm *。然后可以使用std::put_time()可以字符串化输出当前时间。
2.std::strftime
转换 std::tm 对象到自定义的文本表示
void printCurrentSystemTime(void)
{
std::chrono::system_clock::time_point sysT = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::seconds>(sysT.time_since_epoch()).count() << std::endl;
auto t1 = std::chrono::system_clock::to_time_t(sysT);
std::cout << std::put_time(std::localtime(&t1), "%Y-%m-%d %H:%M:%S") << std::endl;
char buffer[80];
std::strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", std::localtime(&t1));
std::cout << "use strftime: " << buffer << std::endl;
}

浙公网安备 33010602011771号