C++11时间日期库chrono的使用

chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,主要包含了:duration, time_point, clock。

时钟与时间点

chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应类型的时间点。

clock

时钟是从一个时点开始,按照某个刻度的计数;chrono同时提供了三种时钟(通过now()获取当前时间点):

  • system_clock:系统时钟,相对epoch(1970-01-01 00:00:00UTC)的时间间隔;
  • steady_clock:单调时钟,只能增长(后一次调用now()得到的时间总是比前一次的值大);一般是相对于系统启动时间的时间间隔;
  • high_resolution_clock:高精度时钟(当前系统能提供的最高精度时钟,很可能就是steady_clock),也是单调的;

需要得到绝对时点的场景使用system_clock;需要得到时间间隔,且不受系统时间修改而受影响时使用steady_clock。

时间显示

在C++20中直接有to_stream直接输出system_clock时钟;但在此之前,只能通过间接的方式来输出:

c 复制代码
auto tNow = system_clock::now();
auto tmNow = system_clock::to_time_t(tNow);
auto locNow = std::localtime(&tmNow);
cout<<std::put_time(locNow, "%Y-%m-%d %H:%M:%S")<<endl; // 2019-12-20 19:35:12

system_clock::from_time_t(...)可以把time_t类型时间转换为time_point,便于chrono使用。

运行计时

通过steady_clock/high_resolution_clock可方便的进行计时:

scss 复制代码
public:
  explicit XRunTime{bool bStart){
    if(bStart) Restart();
  }

  void Restart(){
    m_tpStart = high_resolution_clock::now();
  }

  double Stop(){
    return operator()();
  }
  double operator()(void){
    auto tpEnd = high_resolution_clock::now();
    auto elap = tpEnd - m_tpStart;
    return (double)elap.count() / std::nano::den; //返回运行的秒数,如1.00345
  }
}

时间间隔duration

chrono中使用duration模板类来表示时间间隔,并定义了从小时到纳秒的时间间隔。

duration模板

duration使用一个数值(表示时钟数)和分数(ratio)来表示具体间隔。支持基本的算术运算,并通过count()获取具体的时钟数。

arduino 复制代码
template<typename _Rep, typename _Period = ratio<1>>
struct duration
{
  typedef _Rep   rep;

  constexpr _Rep count() const{
    return (_MyRep);
  }
  ...
private:
  _Rep  _MyRep;  //时钟计数
};

基准是秒,并依次定义了常用的间隔,如:

arduino 复制代码
typedef duration<long long> seconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long, ratio<3600>> hours;

不同的时间间隔可以直接进行算术运算,如休眠需要毫秒参数,我们可以封装接收秒与毫秒的接口:

c 复制代码
void MySleep(int nSec, int nMillSec){
  std::chrono::seconds secs(nSec);
  std::chrono::milliseconds mills(nMillSec);
  std::this_thread::sleep_for(secs+mills);
}

duration_cast

使用duration_cast可以方便的在不同时间单位间进行转换,如:

scss 复制代码
auto sec=seconds(123);
auto minu=duration_cast<minutes>(sec);
cout<<sec.count()<<","<<minu.count()<<endl; // 123,2

ratio

ratio是一个分数模板类,第一个参数为分子,第二个参数为分母;通过静态成员可获取:

  • num:分子
  • den:分母
c 复制代码
typedef ratio<1, 1000> milli;
typedef ratio<1000, 1> kilo;
cout<<milli::den<<endl; // 1000
相关推荐
智购科技自动贩卖机17 分钟前
自动售货机嵌入式系统Go语言开发实践:从资源受限设备到RTOS协程调度的工程化之路
大数据·linux·数据库·人工智能·yolo·架构·golang
独孤九剑打醒他33 分钟前
从“铁块一直在辐射电磁波“到EUV光源:微波等离子体MPP架构全链路推演
前端·架构·硬件工程
lhldsg35 分钟前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY36 分钟前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh36 分钟前
百日算法修炼 · Day 17
数据结构·算法
XUEYUAN521238 分钟前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
sel_942 分钟前
【多轮对话论文导读(七)】多轮对话论文阅读笔记:从数据生成、用户模拟到上下文重构与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·语言模型·自然语言处理
远游客071344 分钟前
为什么用「年×100+月」做比较
算法·gin
肠畔码农1 小时前
深入分布式事务内核:从 2PC/XA 到 Seata AT 模式的架构演进与权衡
分布式·架构
weixin199701080161 小时前
《大促护航:电商API限流与降级,双11峰值500万调用的架构复盘》(附Python源码)
python·架构·wpf