参考:http://www.cplusplus.com/reference/chrono/
chrono既是一个头文件的名字,也是一个子命名空间的名字。头文件中的元素用来处理时间。这主要通过三个概念实现的:
Durations | 时间跨度:例如1分钟、1小时等。由duration类表示,使用数字和单位综合表示。 |
Time Points | 时间点,例如某人的生日、今天的黎明。由time_point类来表示,使用duration类和某一时间点(clock类)综合表示。 |
Clocks | 将时间点与实际物理时间联系起来。三种时钟,表示当前时间为time_points。 |
duration:
原型为:
template<class Rep, class Period = std::ratio<1>> class duration;
(std::ratio为一个比值原型为 template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio;)
模板参数:
Rep:算术类型。
Period:表示以秒为单位的周期比率类型。
方便起见,另外一些类型也在命名空间中定义如下:
typedef duration <Rep, ratio<3600,1>> hours;
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;
typedef duration <Rep, ratio<1,1000000>> microseconds;
typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
所以我们实际上可以这样使用:
using second = std::chrono::duration <int, std::ratio<1, 1>>;
std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒
std::this_thread::sleep_for(second(3)); //休眠三秒
//输出其数字部分
std::cout << second(3).count() << endl;
//可以进行赋值和加减乘除等运算,例:
second a1(1),a2(2);
std::this_thread::sleep_for(a1+a2); //休眠三秒
std::this_thread::sleep_for(a1*2); //休眠两秒
Time Point:
原型为:
template <class Clock, class Duration = typename Clock::duration> class time_point;
模板参数:
Clock:一种clock类,比如system_clock,steady_clock。
Duration:duration类。
//返回一个duration,表示该时间点到1970.1.1的时间跨度值
duration time_point::time_since_epoch() const;
Clock:
原型为:
//system_clock,一个系统范围的实时时钟
//旨在表示实时,所以可以转换为日历表示,或从日历表示转换过来(成员函数to_time_t 和 from_time_t)
//该类的time_point可以表示某时间点之前的时间(负值)
//系统上所有运行的进程都应该使用该时钟检索time_point值
class system_clock;
//steady_clock,专门用来计算时间间隔
//时钟的每一次滴答都会花费相同的物理时间
class steady_clock;
//high_resolution_clock,滴答周期最短的时钟(高精度),是system_clock或steady_clock的别名
class high_resolution_clock;
//打印明天的日期,system_clock example
#include <iostream>
#include <chrono>
#include <ratio>
#include <ctime>
using namespace std;
using namespace std::chrono;
int main()
{
int a;
duration<int, std::ratio<60 * 60 * 24>> one_day(1);
system_clock::time_point today = system_clock::now();
system_clock::time_point tommorow = today + one_day;
time_t tt;
tt = system_clock::to_time_t(tommorow);
cout << ctime(&tt) << endl;
cin >> a;
return 0;
}
//打印时间间隔,steady_clock example
#include <iostream>
#include <chrono>
#include <ratio>
#include <ctime>
using namespace std;
using namespace std::chrono;
int main()
{
int a;
steady_clock::time_point tp1 = steady_clock::now();
for (int i = 0; i < 1000; i++)
cout << "*";
steady_clock::time_point tp2 = steady_clock::now();
duration<double > time_span = duration_cast<duration<double>>(tp2 - tp1);
cout << endl << time_span.count() << "seconds" << endl;
cin >> a;
return 0;
}
考虑到需要进行不同duration子类型的转换,chrono库给出了druation_cast。其原型为:
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast (const duration<Rep,Period>& dtn);
具体作用为将dth的值转换为其他持续时间类型,并考虑到它们的差异。
//duration_cast example
#include <iostream>
#include <chrono>
#include <ratio>
#include <ctime>
using namespace std;
using namespace std::chrono;
int main()
{
int a;
chrono::minutes const mintue(1);
duration<int> sec = duration_cast<chrono::minutes> (mintue);
cout << endl << sec.count() << "seconds" << endl;
cin >> a;
return 0;
}
类似的,time_point也有这样的方法。