C++11时间操作
C++11提供了chrono库,这个库可以处理和时间相关的一些事情。这个库里面主要有3个类:时间间隔Duration、时钟Clocks和时间点Time point。
Duration
template<class Rep, class Period = std::ratio<> > class duration;
概述
类模板 std::chrono::duration
表示时间间隔。
它由 Rep
类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。
存储于 duration
的数据仅有 Rep
类型的计次数。若 Rep
是浮点数,则 duration
能表示小数的计次数。 Period
被包含为时长类型的一部分,且只在不同时长间转换时使用。
类型说明
rep
Rep
表示计次数的算术类型
template<std::intmax_t Num, std::intmax_t Denom = > class ratio;
period
Period
表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,分母默认为1,ratio代表的是一个分子除以分母的分数值
对于一些特定的时间值已经有了定义:
std::chrono::nanoseconds duration</*至少 64 位的有符号整数类型*/,std::nano>
std::chrono::microseconds duration</*至少 55 位的有符号整数类型*/,std::micro>
std::chrono::milliseconds duration</*至少 45 位的有符号整数类型*/,std::milli>
std::chrono::seconds duration</*至少 35 位的有符号整数类型*/>
std::chrono::minutes duration</*至少 29 位的有符号整数类型*/,std::ratio<>>
std::chrono::hours duration</*至少 23 位的有符号整数类型*/,std::ratio<>>
更直观一些的定义如下:
typedef duration <Rep, ratio<,>> hours;
typedef duration <Rep, ratio<,>> minutes;
typedef duration <Rep, ratio<,>> seconds;
typedef duration <Rep, ratio<,>> milliseconds;
typedef duration <Rep, ratio<,>> microseconds;
typedef duration <Rep, ratio<,>> nanoseconds;
通过定义这些常用的时间间隔类型能方便在线程休眠这种场景下使用它们:
std::this_thread::sleep_for(std::chrono::seconds()); //休眠三秒
std::this_thread::sleep_for(std::chrono:: milliseconds ()); //休眠100毫秒
成员函数
1、count:返回此 duration 的计次数,即获取时间间隔的时钟周期个数。如果感到晦涩可以看下面的例子1。
2、operator+、operator-、前/后++、前/后--、operator+=、operator-=、operator*=、operator/=、operator%=:做一些加减乘除的元素。
3、duration_cast:转换 std::chrono::duration 为不同类型 ToDuration
的时长。
例子1:
#include <iostream>
#include <chrono> int main()
{
using shakes = std::chrono::duration<int, std::ratio<, >>;
using jiffies = std::chrono::duration<int, std::centi>;
using microfortnights = std::chrono::duration<float, std::ratio<,>>;
using nanocenturies = std::chrono::duration<float, std::ratio<,>>; std::chrono::seconds sec(); std::cout << "1 second is:\n"; // 无精度损失的整数尺度转换:无转型
std::cout << std::chrono::microseconds(sec).count() << " microseconds\n"
<< shakes(sec).count() << " shakes\n"
<< jiffies(sec).count() << " jiffies\n"; // 有精度损失的整数尺度转换:需要转型
std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
<< " minutes\n"; // 浮点尺度转换:无转型
std::cout << microfortnights(sec).count() << " microfortnights\n"
<< nanocenturies(sec).count() << " nanocenturies\n";
}
运行结果:
1 second is:
1000000 microseconds
100000000 shakes
100 jiffies
0 minutes
0.82672 microfortnights
0.316957 nanocenturies
最后的2个比较怪异的时间是这样来的:
>>> 1000.0 / 3155 = 0.31695721077654515,就是说3155秒对应1000个microfortnights
>>> 10000.0 / 12096 = 0.8267195767195767,就是说12096秒对应10000个nanocenturies
例子2:
#include <iostream>
#include <chrono>
#include <ratio>
#include <thread> using half_second = std::chrono::duration<float, std::ratio<, > >; int main()
{
std::chrono::seconds s{};
std::cout << "use second : " << s.count() << std::endl; half_second ss{};
std::cout << "use half_second : " << ss.count() << std::endl;
std::cout << "use half_second : " << half_second().count() << std::endl;
std::cout << "use half_second : " << half_second(s).count() << std::endl; std::chrono::minutes m{};
std::cout << "use half_second : " << half_second(m).count() << std::endl; std::chrono::system_clock::time_point tt1 = std::chrono::system_clock::now();
std::this_thread::sleep_for(std::chrono::seconds());
std::chrono::system_clock::time_point tt2 = std::chrono::system_clock::now();
std::cout << (tt2-tt1).count()<<" tick count" << "\t" << std::chrono::duration_cast<std::chrono::milliseconds>(tt2-tt1).count() <<std::endl; std::chrono::system_clock::time_point tt3 = std::chrono::system_clock::now();
std::this_thread::sleep_for(half_second());
std::chrono::system_clock::time_point tt4 = std::chrono::system_clock::now();
std::cout << (tt4-tt3).count()<<" tick count" << "\t" << std::chrono::duration_cast<std::chrono::milliseconds>(tt4-tt3).count() <<std::endl; std::chrono::minutes t1( );
std::chrono::seconds t2( );
std::chrono::seconds t3 = t1 - t2;
std::cout << t3.count() << " second" << std::endl; std::cout << std::chrono::duration_cast<std::chrono::minutes>( t3 ).count() << " minutes" << std::endl; return ;
}
运行结果:
use second : 1
use half_second : 1
use half_second : 4
use half_second : 2
use half_second : 120
1000063777 tick count 1000
500060683 tick count 500
540 second
9 minutes
关于自己定义的half_second计时,传入的是数字的话,count就是实际数字,只有传入了其他时间单位的话才能体现出half_second的“半秒”的作用。
还有就是注意sleep_for里面的half_second也是生效了。
本文参考自:
http://www.cnblogs.com/qicosmos/p/3642712.html
http://zh.cppreference.com/w/cpp/chrono
最新文章
- Highcharts使用教程(1):制作简单图表
- git Submodule
- Ubuntu14.04安装配置Open vSwitch
- IIS 7.0 下 httpMoudle 失效的问题
- ASP.NET读取配置文件发送邮件
- strassen algorithm
- 【hihoCoder第十五周】最近公共祖先&#183;二
- 跨域文件crossdomain.xml在weblogic上的部署
- Python Extension Packages下载链接
- Advanced Installer 制作.NetWeb部署安装包
- js架构设计模式——你对MVC、MVP、MVVM 三种组合模式分别有什么样的理解?
- Hibernate快速入门实例
- Java8内存模型—永久代(PermGen)和元空间(Metaspace)
- 隔离 docker 容器中的用户-------分享链接
- python第九十六天 ---Django(1)
- java生成PDF,各种格式、样式、水印都有
- webpack配置提取公共代码
- 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力
- hibench学习
- Skype for Business 安装组件RewriteModule失败
热门文章
- SqlServer查看对象(表、存储过程、函数)在哪些地方被引用或引用哪些地方
- BlackBerry10 开发环境搭建
- Google Breakpad 完全解析(一) —— Windows入门篇
- activiti源码笔记对标的博客
- 万里长征第二步——django个人博客(第四步 ——创建数据库)
- B. Suffix Structures 模拟吧,情况比較多要想周全
- deferred rendering with msaa
- OC中数组的使用方法
- Deferred content load was not performed. To provide the content, subscribe to the View&#39;s QueryControl event
- Windows注册表中修改CMD默认路径