整理c++ chrono时间库常用用法

参考链接:

chrono时间库平时主要用于sleep()操作,计算操作时间间隔,一些标准库的wait()函数(比如future变量的wait_for())的参数等。
chrono库里面主要包括时钟,时间点,时长三个概念。

时钟

系统时钟的一些常用用法

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;
}
posted @ 2025-03-21 17:50  酸菜馅粘豆包  阅读(219)  评论(0)    收藏  举报