以下整理自: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. getpass密码隐藏

    使用getpass模块对输入的字符进行隐藏输入 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import getpass u ...

  2. CDM中,创建一个或多个组合属性的唯一约束

    除主键外,有时还需要创建一个或多个组合字段的唯一约束,方法如下: 双击打开实体,在idntifier标签页中可看到默认主键的唯一约束,在其下方添加一条记录,然后双击该记录,打开约束设置窗口 在该窗口的 ...

  3. webService调用模式比较

  4. CentOs登陆输入root作为用户名

  5. 201671010127 2016—2017-2 java编程中遇到的问题

    学习了Java的一些基本语法后,心里的激动无法按捺,总是比较Java与C语言语法的区别,一有闲时间就会用刚学的Java基本语法写一些简单的程序.这不,一不小心又陷入了困难,本人在此诚挚的请教各位园友, ...

  6. 使用Apache IO库操作IO与文件

    --------------siwuxie095                         首先到 Apache官网 下载相关的库文件     Apache官网:http://www.apach ...

  7. SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证

    1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ...

  8. 微信内置浏览器中的cookie很诡异呀

    微信内置浏览器中的cookie很诡异呀 这是设置和删除COOKIE的代码 function set_cookie($var ,$value = '' ,$expire = 0){ $path = '/ ...

  9. Luogu 2868 [USACO07DEC]观光奶牛Sightseeing Cows

    01分数规划复习. 这东西有一个名字叫做最优比率环. 首先这个答案具有单调性,我们考虑如何检验. 设$\frac{\sum_{i = 1}^{n}F_i}{\sum_{i = 1}^{n}T_i} = ...

  10. PHP中 null ,false , 区别

    先来测试一下吧: if(0 ==''){ echo '<br/>在PHP中0 ==\'\'' ; } if(0 !==''){ echo '<br/>在PHP中0 !==\'\ ...