以下整理自:https://www.2cto.com/kf/201404/290706.html

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

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;

它表示每个时钟周期的秒数,其中第一个模板参数 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<,>> 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(3)); //休眠三秒

std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒

chrono 还提供了获取时间间隔的时钟周期个数的方法 count()

count 以及 duration 的基本用法:

 #include <iostream>
#include <chrono>
using namespace std; int main(void) {
std::chrono::milliseconds ms{};//3毫秒 std::chrono::microseconds us = * ms;//6000微秒 std::chrono::duration<double, std::ratio<, >> hz(3.5);
//hz为3.5个周期时间长度,每个周期为1/30s cout << ms.count() << endl;//3 一个周期为1s
cout << us.count() << endl;//6000 一个周期为1us
cout << hz.count() << endl;//3.5 return ;
}

时间间隔之间可以做运算,比如下面的例子中计算两端时间间隔的差值:

 #include <iostream>
#include <chrono>
using namespace std; int main(void) {
std::chrono::minutes t1();//10分钟 std::chrono::seconds t2( );//60秒 std::chrono::seconds t3 = t1 - t2; //t3 的时间周期为 second
std::cout << t3.count() << " second" << std::endl; //通过 duration_cast 将时间周期转化为 minutes
cout << chrono::duration_cast<chrono::minutes>(t3).count() << " minutes" << endl; // 输出:
// 540 second
// 9 minutes return ;
}

注意:我们还可以通过duration_cast<>() 来将当前的时钟周期转换为其它的时钟周期,如我可以把秒的时钟周期转换为分钟的时钟周期,然后通过 count 来获取转换后的分钟时间间隔

time point:

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

 #include <iostream>
#include <ratio>
#include <chrono>
using namespace std; int main(void) {
using namespace std::chrono;
typedef duration<int, std::ratio< * * >> day_type; time_point<system_clock, day_type> today = time_point_cast<day_type>(system_clock::now());
cout << today.time_since_epoch().count() << " days since epoch" << endl; // 输出:
// 17598 days since epoch return ;
}

time_point还支持一些算术元算,比如两个time_point的差值时钟周期数,还可以和duration相加减。下面的例子输出前一天和后一天的日期:

 #include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>
using namespace std; int main(void) {
using namespace std::chrono;
system_clock::time_point now = system_clock::now();//获得当前时间 std::time_t last = system_clock::to_time_t(now - std::chrono::hours());
std::time_t next = system_clock::to_time_t(now + std::chrono::hours()); return ;
}

clocks

表示当前的系统时钟,内部有 time_point, duration, Rep, Period 等信息,它主要用来获取当前时间,以及实现 time_t 和 time_point 的相互转换。Clocks包含三种时钟:

system_clock:从系统获取的时钟;

steady_clock:不能被修改的时钟;

high_resolution_clock:高精度时钟,实际上是 system_clock 或者 steady_clock 的别名

可以通过 now() 来获取当前时间点:

 #include <iostream>
#include <chrono>
#include <ratio>
using namespace std; int main(void) {
using namespace std::chrono; time_point<system_clock> t1 = system_clock::now();
int cnt = 1e9;
while(--cnt);
time_point<system_clock> t2 = system_clock::now(); cout << (t2 - t1).count() << endl;
//通过 duration_cast<>() 将周期转化为 secondse
cout << std::chrono::duration_cast<seconds>( t2-t1 ).count() << endl; // 输出:
// 2669897000
// return ;
}

可以利用 high_resolution_clock 来实现一个类似于 boost.timer 的定时器

 #include <iostream>
#include <chrono>
#define ll long long
using namespace std;
using namespace std::chrono; class Timer{
public:
Timer() : m_begin(high_resolution_clock::now()) {}
//重置当前时间
void reset() {
m_begin = high_resolution_clock::now();
} //默认输出毫秒
ll elapsed() const {
return duration_cast<chrono::milliseconds>(high_resolution_clock::now() - m_begin).count();
} //微秒
ll elapsed_micro() const {
return duration_cast<chrono::microseconds>(high_resolution_clock::now() - m_begin).count();
} //纳秒
ll elapsed_nano() const {
return duration_cast<chrono::nanoseconds>(high_resolution_clock::now() - m_begin).count();
} //秒
ll elapsed_seconds() const {
return duration_cast<chrono::seconds>(high_resolution_clock::now() - m_begin).count();
} //分
ll elapsed_minutes() const {
return duration_cast<chrono::minutes>(high_resolution_clock::now() - m_begin).count();
} //时
ll elapsed_hours() const {
return duration_cast<chrono::hours>(high_resolution_clock::now() - m_begin).count();
} private:
time_point<high_resolution_clock> m_begin; }; void fun(int n) {
while(--n);
} int main(void) {
Timer t;//开始记时
fun(1e9);
cout << t.elapsed_nano() << endl;
cout << t.elapsed_micro() << endl;
cout << t.elapsed() << endl;
cout << t.elapsed_seconds() << endl;
cout << t.elapsed_minutes() << endl;
cout << t.elapsed_hours() << endl; // 输出:
// 2673899000
// 2673899
// 2674
// 2
// 0
// return ;
}

c++11时间相关库(chrono)的更多相关文章

  1. C++11 标准库也有坑(time-chrono)

    恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time()   只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...

  2. 漫谈C++11 Thread库之原子操作

    我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...

  3. 漫谈c++11 Thread库之使写多线程程序

    c++11中最重要的特性之一就是对多线程的支持了,然而<c++ primer>5th却没有这部分内容的介绍,着实人有点遗憾.在网上了解到了一些关于thread库的内容.这是几个比较不错的学 ...

  4. c++11 Thread库写多线程程序

    一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...

  5. dpdk-18.11开发库编译安装

    简介 dpdk官网 安装 下载 点击下载地址,选择合适的版本下载.这里下载DPDK 18.11.0 (LTS)版本. 编译 将下载的dpdk-18.11.tar.xz上传服务器,解压,这里放在了/op ...

  6. 11. 标准库浏览 – Part II

    第二部分包含了支持专业编程工作所需的更高级的模块,这些模块很少出现在小脚本中. 11.1. 输出格式 reprlib 模块为大型的或深度嵌套的容器缩写显示提供了 :repr() 函数的一个定制版本: ...

  7. C++11随机数库

    random随机数库 C++11引入了新的随机数生成机制,那就是<random>随机数库,支持多种伪随机数生成算法,多种连续和离散随机数分布算法,以及封装了真正的随机数生成引擎random ...

  8. c++11 时间相关操作练习

    博客和书籍资料 来自该地址 https://www.cnblogs.com/qicosmos/category/490693.html 自行编写相应代码进行学习 // TimeTest.cpp: 定义 ...

  9. C++11标准库中cstdio头文件新增的5个格式化I/O函数学习

    刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf    将格式化输出写入到有大小限制的缓存中 vfs ...

随机推荐

  1. Py修行路 python基础(六)前期基础整理

    计算机中,有且仅有CPU具有执行权限,能够执行指令的只有CPU! 人在应用程序上输入的文字或文本,叫做明文! 在屏幕上输入或是输出的是字符,计算机保存的是 有字符编码的 二进制数. 变量赋值规则:例如 ...

  2. vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)

    vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)

  3. 微信小程序之 wx.getUserInfo引导用户授权问题

    首先,在page外定义一个函数用户判断是否为空对象 var isEmptyObject = function (e) { var temp; for (temp in e) ; } 然后,在page中 ...

  4. app端内容播放,web端的玩具,app通过websocket远程遥控玩具播放内容,玩具管理页面

    一.app端内容播放 下载代码 https://github.com/987334176/Intelligent_toy/archive/v1.0.zip 注意:由于涉及到版权问题,此附件没有图片和音 ...

  5. 「小程序JAVA实战」微信小程序工程结构了解(五)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-05/ 微信小程序工程结构 audio,button,canvas,checkbox 都是由4个文件 ...

  6. MFC 打开外部EXE文件的三种方法

    目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute , ...

  7. s=1+2*3+4*5*6+7*8*9*10+.... C语言求解

    #include <stdio.h> /*类似斐波那契数列的计算方式 项 1 2 3 4 1 2*3 4*5*6 7*8*9*10 生成项的起始数字 1 2 4 7 和后一项的差值 1 2 ...

  8. python拷贝文件小程序(windows)

    #!/usr/bin/python import os source='F:\\lh.jpg' target='E:\\' copy_command="xcopy %s %s"%( ...

  9. 【COCI2012】覆盖字符串

    [题目描述] 给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2 ...

  10. 代码查看import的类是出自哪个jar包的方法(转)

    import java.security.ProtectionDomain; import java.security.CodeSource; public static void main(Stri ...