Chrono

rono库主要包含了三种类型:时间间隔Duration、时钟Clocks、时间点Time poin

一、duration

duration表示一段时间间隔,用来记录时间长度,可以表示几秒钟、几分钟或者几个小时的时间间隔,
duration的原型是:
template<class Rep, class Period = std::ratio<1>> class duration;
第一个模板参数Rep是一个数值类型,表示时钟个数;第二个模板参数是一个默认模板参数std::ratio,
它的原型是:template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio;
ratio表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,分母默认为1,ratio代表的是一个分子除以分母的分数值
如ratio<2>代表一个时钟周期是两秒,ratio<60>代表了一分钟,ratio<60*60>代表一个小时,ratio<60*60*24>代表一天。
而ratio<1, 1000>代表的则是1/1000秒即一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一纳秒。

/*
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;
*/

获取时间间隔的时钟周期个数的方法count()
chrono::duration_cast<seconds>() 时间单位转换,转换成秒
chrono::duration_cast<milliseconds>() 时间单位转换,转换成毫秒 

二、Clocks

Clocks表示当前的系统时钟,内部有time_point, duration, Rep, Period等信息,
 它主要用来获取当前时间,以及实现time_t和time_point的相互转换。
 Clocks包含三种时钟:
 system_clock:从系统获取的时钟;
 steady_clock:不能被修改的时钟;(steady_clock可以获取稳定可靠的时间间隔,后一次调用now()的值和前一次的差值是不因为修改了系统时间而改变,它保证了稳定的时间间隔。它的用法和system用法一样。)
 high_resolution_clock:高精度时钟,实际上是system_clock或者steady_clock的别名。

 chrono::system_clock::time_point与std::time_t类型可相互函数
 chrono::system_clock::to_time_t()
 chrono::system_clock::from_time_t()

三、time_point

time_point表示一个时间点,用来获取1970.1.1以来的秒数和当前的时间, 可以做一些时间的比较和算术运算,和ctime库结合起来显示时间。
time_point必须要clock来计时,time_point有一个函数time_since_epoch()用来获得1970年1月1日到time_point时间经过的duration。

四、实例

#include <iostream>
#include <time.h>
#include <chrono>
#include <string>
#include <ctime>
#include <thread>
#include <iomanip>//io代表输入输出,manip是manipulator(操纵器)的缩写

std::time_t Time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());

int main()
{
    std::chrono::seconds sec_3{ 3 };//3秒钟
    std::chrono::milliseconds mills_5{ 500 };//500毫秒
    auto duration = sec_3 - mills_5;//两者差值,单位默认转到更小的 2500ms
    std::cout << "3秒钟 - 5毫秒 = " << duration.count() << std::endl; //值为2500

    //chrono::duration_cast<>() 时间单位转换
    std::chrono::minutes mintu_2{ 2 };//2分钟
    std::cout << "2分钟等价于 " << std::chrono::duration_cast<std::chrono::seconds>(mintu_2).count() << " 秒钟" << std::endl;//2分钟换算为120秒
  
    //获取当前时间
    //当前时间 time_point 格式  
    std::cout << "\n获取当前时间" << std::endl;
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();//stl库获取当前时间
    std::time_t newTime = std::chrono::system_clock::to_time_t(now);//转换为旧式接口,单位:秒
    std::cout << "newTime = " << newTime << std::endl;
    std::time_t oldTime = time(nullptr);//c函数获取当前时间
    std::cout << "oldTime = " << oldTime << std::endl;// oldTime == timeT
    
    std::cout << "\n格式化时间" << std::endl;;
    auto formatTime = std::put_time(std::localtime(&newTime), "%Y-%m-%d %X");
    std::cout << "formatTime1 = " << formatTime << std::endl;//2023-02-16 23:15:09
    struct tm* ptr;
    char str[24] = { 0 };
    strftime(str, sizeof(str), "%Y-%m-%d-%H%M%S", localtime(&oldTime));
    std::cout << "formatTime2 = " << str << std::endl;

    std::time_t last = std::chrono::system_clock::to_time_t(now - std::chrono::hours(24));
    std::time_t next = std::chrono::system_clock::to_time_t(now + std::chrono::hours(24));
    std::cout << "One day ago, the time was " << std::put_time(std::localtime(&last), "%F %T") << std::endl;
    std::cout << "Next day, the time was " << std::put_time(std::localtime(&next), "%Y-%m-%d %X") << std::endl;

    std::this_thread::sleep_for(std::chrono::milliseconds(100)); //当前线程休眠100毫秒
   
    auto begin = std::chrono::steady_clock::now();
    double int_ms_1 = 0;
    int timeout = 5000;
    do {
        auto end = std::chrono::steady_clock::now();
        int_ms_1 = std::chrono::duration<double, std::milli>(end - begin).count();//计数
        auto int_ms_2 = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);//转化
        auto int_us = std::chrono::duration<double, std::micro>(end - begin).count();
        std::cout << int_ms_1 << " :ms, "
            << " or " << int_ms_2.count() << " ms, "
            << int_us << ":us"
            << std::endl;
    } while (timeout > int_ms_1);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值