C++11时间操作

C++11提供了chrono库,这个库可以处理和时间相关的一些事情。这个库里面主要有3个类:时间间隔Duration、时钟Clocks和时间点Time point。

Duration

1 template<class Rep, class Period = std::ratio<1> > class duration;

概述

类模板 std::chrono::duration 表示时间间隔。

它由 Rep 类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。

存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。

类型说明

rep Rep 表示计次数的算术类型

1 template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio;

period Period 表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,分母默认为1,ratio代表的是一个分子除以分母的分数值

对于一些特定的时间值已经有了定义:

1 std::chrono::nanoseconds     duration</*至少 64 位的有符号整数类型*/,std::nano>
2 std::chrono::microseconds     duration</*至少 55 位的有符号整数类型*/,std::micro>
3 std::chrono::milliseconds     duration</*至少 45 位的有符号整数类型*/,std::milli>
4 std::chrono::seconds     duration</*至少 35 位的有符号整数类型*/>
5 std::chrono::minutes     duration</*至少 29 位的有符号整数类型*/,std::ratio<60>>
6 std::chrono::hours     duration</*至少 23 位的有符号整数类型*/,std::ratio<3600>>

更直观一些的定义如下:

1 typedef duration <Rep, ratio<3600,1>> hours;
2 typedef duration <Rep, ratio<60,1>> minutes;
3 typedef duration <Rep, ratio<1,1>> seconds;
4 typedef duration <Rep, ratio<1,1000>> milliseconds;
5 typedef duration <Rep, ratio<1,1000000>> microseconds;
6 typedef duration <Rep, ratio<1,1000000000>> nanoseconds;

通过定义这些常用的时间间隔类型能方便在线程休眠这种场景下使用它们:

1 std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒
2 std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒

成员函数

1、count:返回此 duration 的计次数,即获取时间间隔的时钟周期个数。如果感到晦涩可以看下面的例子1。

2、operator+、operator-、前/后++、前/后--、operator+=、operator-=、operator*=、operator/=、operator%=:做一些加减乘除的元素。

3、duration_cast:转换 std::chrono::duration 为不同类型 ToDuration 的时长。

例子1:

 1 #include <iostream>
 2 #include <chrono>
 3  
 4 int main()
 5 {
 6     using shakes = std::chrono::duration<int, std::ratio<1, 100000000>>;
 7     using jiffies = std::chrono::duration<int, std::centi>;
 8     using microfortnights = std::chrono::duration<float, std::ratio<12096,10000>>;
 9     using nanocenturies = std::chrono::duration<float, std::ratio<3155,1000>>;
10  
11     std::chrono::seconds sec(1);
12  
13     std::cout << "1 second is:
";
14  
15     // 无精度损失的整数尺度转换:无转型
16     std::cout << std::chrono::microseconds(sec).count() << " microseconds
"
17               << shakes(sec).count() << " shakes
"
18               << jiffies(sec).count() << " jiffies
";
19  
20     // 有精度损失的整数尺度转换:需要转型
21     std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
22               << " minutes
";
23  
24     // 浮点尺度转换:无转型
25     std::cout << microfortnights(sec).count() << " microfortnights
"
26               << nanocenturies(sec).count() << " nanocenturies
";
27 }

运行结果:

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:

 1 #include <iostream>
 2 #include <chrono>
 3 #include <ratio>
 4 #include <thread>
 5 
 6 using half_second = std::chrono::duration<float, std::ratio<1, 2> >;
 7 
 8 int main()
 9 {
10     std::chrono::seconds s{1};
11     std::cout << "use second : " << s.count() << std::endl;
12 
13     half_second ss{1};
14     std::cout << "use half_second : " << ss.count() << std::endl;
15     std::cout << "use half_second : " << half_second(4).count() << std::endl;
16     std::cout << "use half_second : " << half_second(s).count() << std::endl;
17 
18     std::chrono::minutes m{1};
19     std::cout << "use half_second : " << half_second(m).count() << std::endl;
20 
21     
22     std::chrono::system_clock::time_point tt1 = std::chrono::system_clock::now();
23     std::this_thread::sleep_for(std::chrono::seconds(1));
24     std::chrono::system_clock::time_point tt2 = std::chrono::system_clock::now();
25     std::cout << (tt2-tt1).count()<<" tick count" << "	" << std::chrono::duration_cast<std::chrono::milliseconds>(tt2-tt1).count() <<std::endl;
26 
27     std::chrono::system_clock::time_point tt3 = std::chrono::system_clock::now();
28     std::this_thread::sleep_for(half_second(1));
29     std::chrono::system_clock::time_point tt4 = std::chrono::system_clock::now();
30     std::cout << (tt4-tt3).count()<<" tick count" << "	" << std::chrono::duration_cast<std::chrono::milliseconds>(tt4-tt3).count() <<std::endl;
31 
32     std::chrono::minutes t1( 10 );
33     std::chrono::seconds t2( 60 );
34     std::chrono::seconds t3 = t1 - t2;
35     std::cout << t3.count() << " second" << std::endl;
36 
37     std::cout << std::chrono::duration_cast<std::chrono::minutes>( t3 ).count() << " minutes" << std::endl;
38 
39     return 0;
40 }

运行结果:

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

原文地址:https://www.cnblogs.com/abc-begin/p/8044942.html