C++库:chrono

参考: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也有这样的方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值