博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11: chrono
阅读量:5992 次
发布时间:2019-06-20

本文共 7353 字,大约阅读时间需要 24 分钟。

hot3.png

chrono是一个time-library,要使用chrono这个库需要#include<chrono>.

通常要使用chrono这个库必定少不了ratio这个库,需包含#include<ratio>,如果已经#include<chrono>就不需要再#include<ratio>了.

 

我们首先来明确两个概念:

所谓duration(时间段): 指的是在某时间单位上的一个明确的tick(片刻数).举个例子,“3分钟”指的是“3个一分钟”。

所谓timepoint(时间点):的意思是一个duration和一个epoch(起始点)的组合. 典型的例子是“2000年新年午夜”时间点,它被描述为“自1970年1月1日开始的第1 262 300 400秒”。

ratio:

 template 
 class ratio;

Numerator:  分子.

Denominator: 分母.

ratio有两个成员:

ratio::num; //获得ratio的分子.

ratio::den; //获得ratio的分母.

#include 
#include 
int main(){ std::ratio<1, 4> oneForth; std::cout<<"Numrator: "<
<

 

std::chrono::duration

用来表示一段时间.

 template 
<1> >class duration;

Rep: 是一个算术类型(int, double....),或者一类模拟算术类型.

Period: 是一个std::ratio类型.

比如:

 std::chrono::duration
<1,1>> seconds(3);//3秒.

由于各种duration的表示是不同的(比如不同的std::duration,用的std::ratio是不同的)因此标准库还提供了:

template 
  constexpr ToDuration duration_cast (const duration
& dtn);

ToDuration: 是我们想要转成duration的类型.

Rep: 是将要被我们转换的duration类型的算术类型.

Period: 是将要被我转换的duration类型的std::ratio类型.

duration的成员函数:

 constexpr rep count() const;

返回该duration中std::ratio的数量.

 static constexpr duration zero();

返回长度为0的duration.

 

 static constexpr duration min();

返回此类型之最小的可能.

 

 static constexpr duration zero();

返回此类型之最大的可能.

 

#include 
#include 
#include 
int main(){ using second_type = std::chrono::duration
<1, 1>>; using minutes_type = std::chrono::duration
<60, 1>>; using hour_type = std::chrono::duration
<3600, 1>>;   second_type oneDay1(24*3600); //一天:24*3600秒.  minutes_type oneDay2(24*60); //一天: 24*60分钟.  hour_type oneDay3(24);      //一天: 24小时.   //hour_type oneDay4(oneDay2); //error.不能直接转换.  hour_type oneDay5(oneDay3); // ok. hour_type oneDay6(std::chrono::duration_cast
(oneDay2)); //ok.  std::cout<< oneDay3.count() <
(ms); minutes mm = duration_cast
(ms % hours(1)); //注意这里ms是个std::chrono::milliseconds类型.  seconds ss = duration_cast
(ms % minutes(1)); std::cout<<"hours: "<
<<" minutes: "<
<<" seconds: "<
<

 

Clock:

Clock定义出了一个epoch(起始点)和一个tick(周期,也可以称作period).例如某个Clock也许定义周期(tick)为毫秒(millionsecond),起始点是UNIX epoch(起始点): 1970年1月1日, 或者定义周期(tick)为纳秒(nanosecond),起始点为程序员的开始时间.

Clock还提供了一个类型给“与此Clock关联”的任何timepoint使用,例如Clock的now()成员函数可以产出一个代表“现在时刻”的timepoint对象.

 

Clock(时钟)有三种:

std::system_clock;  //它所表现的timepoint(时间点)将关联到现行系统的即时时钟.这个clock提供便捷函数to_time_t()和from_time_t(),允许我们在timepoint和C语言的系统时间类型time_t之间转换。

std::steady_clock;  //它保证绝对不会被调整。因此当实际时间流逝,其timepoint值也绝对不会减少,而且这些timepoint对于真实时间都有稳定的前进速率.

std::high_resolution_clock;  //它表现的是当前系统中带有最短tick(周期)的clock.(我们常用的时间周期是1秒).也就是说它是更高精度的std::steady_clock

注意,标准库并不强制规定各种clock的精确度, epoch(起始点), "最大和最小的timepoint的范围"

 以上3种Clock都具有的成员类型:

Clock::duration  //获得Clock的duration(时间段)类型.因为一般情况下我们是不知道Clock的计时单位的因此用这个比较保险.

Clock::rep  //获得上面得到的duration的算术类型比如是:double啊,int啊,等等,等价于:Clock::duration::rep

Clock::period //获得当前Clock的duration类型的,计时单位,是分? 是秒?其实也就是一个std::ratio类型.

也相当于Clock::duration::period.

Clock::is_steady //如果该Clock是一个steady类型,该值为true.

Clock::now()  //一个static函数,获得调用该函数时候的当前时刻.

 

 #include 
#include 
#include 
template
< std::is_same
::value                                                          || std::is_same
::value                      || std::is_same
::value                      >::type>void printClockData(){ std::cout<<"- precision: "; using P = typename Clock::period; //相当于Clock::duration::period;其实是一个std::ratio类型.  if(std::ratio_less_equal
::value){  using TT = typename std::ratio_multiply
::type; //这里的type是std::ratio类型.  std::cout<< std::fixed << double(TT::num)/TT::den << " milliseconds " << std::endl;    }else{  std::cout<< std::fixed << double(P::num)/P::den <<" seconds"<
<<"- is_steady: "<< std::boolalpha << Clock::is_steady << std::endl;}
int main(){ std::cout<< "system_clock: " <
(); std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now(); std::cout<< "system_clock::now() "<
<< "cost: "<< sd.count() <
(); std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now(); std::cout<< "high_resolution_clock::now() " <
<< "cost: "<< hd.count() <
(); std::chrono::steady_clock::time_point t3 = std::chrono::steady_clock::now(); std::cout<< "steady_clock::now() "<
<<"cost: "<< ssd.count() <
 du = ssd; std::chrono::steady_clock::period ratioForSteady_clock; std::cout<< ratioForSteady_clock.num << " " << ratioForSteady_clock.den <

 

Timepoint(时间点):

夹带(搭配)那些clock,甚至用户自定义的clock,你将可以处理timepoint。Class time_point提供了相应接口,以一个clock为参数.

template 
 class time_point;

下面4个特定的timepoint扮演了特殊的角色.

1,Epoch, 由任何clock的time_point的default构造函数产出.

2,Current time, 由任何clock的static成员函数now()产出.

3,Minimnum timepoint, 由任何clock的timepoint的static成员函数min()产出.

4,Maximum timepoint, 由任何clocktimepoint的static成员函数max()产出.

#include 
#include
#include
#include
std::string asString(const std::chrono::system_clock::time_point& tp){ std::time_t t = std::chrono::system_clock::to_time_t(tp); std::string timeString = std::asctime(std::gmtime(&t)); //timeString.resize(timeString.size()-1); return timeString;} int main(){ std::chrono::system_clock::time_point tp; std::cout<< "epoch: "<< asString(tp) <
>; userDefined tp1 = std::chrono::time_point_cast
>(std::chrono::system_clock::time_point::min()); std::cout<< "min: "<< asString(tp1) <
> t_p; std::chrono::system_clock::time_point tp2(t_p); tp2 = std::chrono::system_clock::time_point::max(); std::cout<< "max: "<< asString(tp2)<

std::chrono::time_point的operator(s):

#include 
#include
#include
#include
std::string asString(const std::chrono::system_clock::time_point& tp){ std::time_t t = std::chrono::system_clock::to_time_t(tp); std::string timeString(std::ctime(&t)); return timeString;}int main(){ using Days = std::chrono::duration
>; using Hours = std::chrono::duration
>; using Minutes = std::chrono::duration
>; using Seconds = std::chrono::duration
>; using Years = std::chrono::duration
>; std::chrono::time_point
tp1; std::cout<< "Epoch: "<< asString(tp1) <
dis = tp1 - std::chrono::system_clock::time_point(); //注:上面减号后面的 std::chrono::system_clock::time_point();获得的是Epoch. std::cout<< "Diff: " << (std::chrono::duration_cast
(dis)).count() << " minute(s)." <
(dis); std::cout<< "days: " << days.count() << " day(s)."<

16/6/21:

两种打印时间字符串的方法:

#include 
#include
#include
int main(){ //case 1: 这种情况下是考虑时区的. std::chrono::time_point
tp; //epoch std::time_t t = std::chrono::system_clock::to_time_t(tp); std::string strOne = std::ctime(&t); strOne.resize(strOne.size()-1); //去除尾部的换行符. std::cout<< strOne << std::endl; //case 2: 不考虑时区. std::chrono::time_point
tp_one; //epoch std::time_t tTwo = std::chrono::system_clock::to_time_t(tp_one); std::string strTwo = std::asctime(std::gmtime(&tTwo)); std::cout<< strTwo <

 

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/671830

你可能感兴趣的文章
python大佬养成计划----HTML网页设计(序列)
查看>>
EOS Asia & 思否区块链达成战略合作
查看>>
文本分析——分词、统计词频、词云
查看>>
网站安全:你面临2个至关重要的挑战!
查看>>
ES6学习笔记2---对象的扩展
查看>>
零 bug 策略
查看>>
阿里数据中台七年演化史——行在口述干货
查看>>
中国学术力量不容小觑,首届华人带头的国际分布式人工智能学术会议将于北京召开 ...
查看>>
东南亚科技公司BLUE Mobile完成C轮融资,蚂蚁金服领投、愉悦资本跟投 ...
查看>>
传统网站维护难,智能化建站平台帮助国际学校一站解决 ...
查看>>
在巴塞罗那,华为挥别昨日 | MWC 2019
查看>>
我们3666人的【阿里Java技术进阶】钉钉大群,又增添新 “成员” 啦~ ...
查看>>
同盾科技与中科实数共建互联网反黑产联合实验室 ...
查看>>
读懂微信:从1.0到7.0版本,一个主流IM社交工具的进化史 ...
查看>>
Flask 教程 第十章:邮件支持
查看>>
C++雾中风景13:volatile解惑
查看>>
绿色版Mysql自动建立my.ini和命令行启动并动态指定datadir路径
查看>>
华为5G手机发布!5G和AI给世界带来什么?
查看>>
SQL Server使用sp_spaceused查看表记录存在不准确的情况
查看>>
网站服务器购买配置选购方案
查看>>