C++11 std::chrono时间库

主要时间类型

std::ratio 定义分式

  • 例如
    std::ratio<60, 1> minutes;//<分子,分母>一分钟60秒
    std::ratio<60 * 60> hource;//1小时3600秒
    std::ratio<1, 1000> milliseconds; //1ms是1/1000秒

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;
   typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
  • 使用举例
    chrono::minutes mintu{2};//2分钟
    chrono::seconds sec{3};//3秒钟
    chrono::milliseconds mills{500};//500毫秒
    auto dul = sec - mills;//两者差值,单位默认转到更小的 2500ms
    dul.count(); //值为2500
    std::this_thread::sleep_for(std::chrono::milliseconds(100)); //当前线程休眠100毫秒
  • chrono::duration_cast<>() 时间单位转换
chrono::duration_cast<chrono::seconds>(mintu).count(); //2分钟换算为120秒 

获取当前时间

time_point 表示一个时间点

  • 获取当前时间
chrono::system_clock::time_point now = chrono::system_clock::now();//当前时间time_point格式

 std::time_t oldTime = time(nullptr);//c函数获取当前时间
 cout << "oldTime = " << oldTime << endl;
 chrono::system_clock::time_point timePoint = chrono::system_clock::now();//stl库获取当前时间
 std::time_t newTime = chrono::system_clock::to_time_t(timePoint);//转换为旧式接口,单位:秒
 cout<<"newTime = " << newTime <<endl;// oldTime == timeT
  • 格式化打印当前时间
/*  chrono::system_clock::time_point与std::time_t类型可相互函数
 *  chrono::system_clock::to_time_t()   
 *  chrono::system_clock::from_time_t()     
 */
std::time_t nowTime = chrono::system_clock::to_time_t(now);//转换为 std::time_t 格式 
std::put_time(std::localtime(&nowTime), "%Y-%m-%d %X"); // 2019-06-18 14:25:56
  • std::localtime非线程安全,使用localtime_r函数代替
struct tm cutTm = {0};
std::put_time(localtime_r(&nowTime, &cutTm), "%Y-%m-%d %X");// 2019-06-18 14:25:56

打印程序执行耗时

/*
 * 打印耗时,取变量构造函数与析构函数的时间差,单位ms
 */
class SpendTime
{
public:
    SpendTime():_curTimePoint(std::chrono::steady_clock::now())
    {
    }
    
    ~SpendTime(){
        auto curTime = std::chrono::steady_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(curTime - _curTimePoint);
        cout<<"SpendTime = "<<  duration.count() <<"ms"<<endl;
    }

private:
    std::chrono::steady_clock::time_point _curTimePoint;
};
#include 
#include 

/*
 * 测量时间流逝
 * 精度依赖于操作系统或编译器,具体依赖于std::clock()的返回值精度及CLOCKS_PER_SEC值的定义
 */
class Timer
{
public:
    Timer() : _startTime(std::clock())
    {
    }

    void Restart()
    {
        _startTime = std::clock();
    }

    /*
     * 构造函数至今的耗时,单位s
     */
    double Elapsed() const
    {
        return double(std::clock() - _startTime) / CLOCKS_PER_SEC;
    }

    /*
     * 最小度量,以秒为单位
     */
    double ElapsedMin() const
    {
        return double(1) / double(CLOCKS_PER_SEC);
    }

    /*
     * 最大度量,以秒为单位
     */
    double ElapsedMax() const
    {
        return (double(std::numeric_limits<std::clock_t>::max()) - double(_startTime) / double(CLOCKS_PER_SEC));
    }


private:
    std::clock_t _startTime;//毫秒级精度
};

判断时间戳是否为当天

#include 
#include 
#include 
#include 
#include 
#include 

/*
 * 判断是否是当天,时区问题内部已考虑
 * @param    timeStamp        当前时间戳(单位s)
 * @return   0                今天
 *           >0               过去几天
 *           <0               将来几天
 */
int checkTimestamp(const std::time_t timeStamp)
{
    static std::time_t sLastTimestamp = 0;
    if (sLastTimestamp == 0) {
        static std::once_flag oc;
        std::call_once(oc, [&]()
        {
            tzset();//刷新时区
            sLastTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
        });
    }
    const int lastDay = (sLastTimestamp - timezone)/86400;//转换到当前时区,自1970年来的天数
    const int curDay = (timeStamp - timezone)/86400;
    sLastTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
    
    return (curDay - lastDay);
}

你可能感兴趣的:(视频开发)