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

C++11时间操作的更多相关文章

  1. Java Calendar 类的时间操作

    Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...

  2. Flex时间操作

    小弟是Flex新手,最近一段时间领导要求使用Flex开发B/S的一些项目,需要用到时间上的一些操作.上网查询一番好多人都说不好操作,有的甚至非常麻烦.基于此,小弟整理了一些关于Flex时间操作的经验, ...

  3. JAVA中的时间操作

    java中的时间操作不外乎这四种情况: 1.获取当前时间 2.获取某个时间的某种格式 3.设置时间 4.时间的运算 好,下面就针对这四种情况,一个一个搞定. 一.获取当前时间 有两种方式可以获得,第一 ...

  4. Mysql 时间操作

    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度) 1 . 查看当天日期 select current_date(); 2. 查看当天时间 select current_time(); ...

  5. Python常用时间操作总结【取得当前时间、时间函数、应用等】转载

    Python常用时间操作总结[取得当前时间.时间函数.应用等] 转载  2017-05-11   作者:清风乐逍遥    我要评论 这篇文章主要介绍了Python常用时间操作,包括取得当前时间.时间函 ...

  6. java中常用的时间操作

    最近项目设计时间的转换和计算,长时间没用时间操作了,感觉手有点生,所以在这里记录一下: Date 常用的方法: getTime() .setTime(): SimpleDateFormate 常用的方 ...

  7. c++-字符串和时间操作

    C++ 字符串 C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符 ...

  8. Python基础 | 日期时间操作

    目录 获取时间 时间映射 格式转换 字符串转日期 日期转字符串 unixtime 时间计算 时间偏移 时间差 "日期时间数据"作为三大基础数据类型之一,在数据分析中会经常遇到. 本 ...

  9. Hive 时间操作

    Hive 时间转换 UNIX时间戳概念:因为UNIX时间戳只是一个秒数,一个UNIX时间戳在不同时区看来,时间是不同的.如UNIX时间戳0,在0时区看来是1970-01-01 00:00:00,在东八 ...

随机推荐

  1. redis_常见问题

    一.使用shutdown关闭服务后,使用redis-server.redis-server redis.conf.redis-cli均提示无法连接,运行命令services.msc,启动redis服务 ...

  2. PHP版本切换

    前言 php是为了快速构建一个web页面而迅速被大家广为接受的开源语言,通过不断发展已经有了很多的php开源系统,满足了目前大部分用户的站点需求.1995年初php诞生到现在已经存在多个版本,并且每个 ...

  3. Android开发高级进阶——多进程间通信

    一. 什么是多进程? 多进程就是多个进程的意思,那么什么是进程呢? 当一个应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名. 进程的特点: 进 ...

  4. 流畅的python第八章对象引用,可变性和垃圾回收

    变量不是盒子 在==和is之间选择 ==比较两个对象的值,而is比较对象的标识 元组的相对不可变姓 元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用.如果引用的元素是可变的 ...

  5. 使用ant构建报错,编码GBK的不可映射字符解决方法

    使用ant的核心就是这个build.xml.然后再在cmd中使用ant命令就行了. build.xml构建文件包含一个工程(project). 工程包含若干个目标(target). 目标可以依赖于其他 ...

  6. supervise 用来监控服务,自动启动

    Atong介绍的这个工具,挺好用的.supervise 官方网站: https://cr.yp.to/daemontools.html cd /data/test cat test.c #includ ...

  7. 亲測,Eclipse报&quot;An error has occurred,See error log for more details. java.lang.NullPointerException&quot;

    Eclipse报"An error has occurred,See error log for more details. java.lang.NullPointerException&q ...

  8. TestNG测试报告美化

    因TestNG自带的测试报告不太美观,可以使用testng-xslt进行美化 1.下载testng-xslt包 2.把/src/main/resources/TestNG-results.xsl放到你 ...

  9. X5平方速算法的证明

    X5代表15,25,35,45,55......以上变化的部分为X,如25这个数,X就等于2. X5平方数的速算法是这样:让X乘以X+1,后面写上25就是X5乘以X5的结果.比如25x25,先让2x3 ...

  10. gcc编译选项汇集

    gcc -g 调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: -g 以操作系统的本地格式(stabs, COFF, XCOFF,或 ...