深入应用C++11之std::chrono(c++的时间库)

通过函数+注释来解释,chrono库的基本用法

#define _CRT_SECURE_NO_WARNINGS

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/***********************************************
一个简单的计算时间差值的函数,test7会封装一个类
************************************************/
void demo()
{
	std::time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());  //now 返回类型 time_point(类)time_point 经过to_time_t 变成time_t类型(long long)
	std::cout << std::put_time(std::localtime(&t), "%Y-%m-%d %X") << std::endl;//localtime 返回结构体   put_time 返回也是结构体
}

/***********************************************

主要介绍 thread 有睡眠函数sleep 不过需要接受的参数为
std::chrono::XXXX  不过在chrono中有重载的可以直接使用
的单位
************************************************/
void test1()
{
	demo();
	std::this_thread::sleep_for(std::chrono::seconds(3));//睡眠3秒
	demo();
	using namespace std::chrono; //重载了h min s ms us ns
	std::this_thread::sleep_for(3s);
	demo();
}

/***********************************************
介绍了 函数count 返回类型可以用long long接受
std::chrono::XXXX 是一个类型 可以定义变量
duration 第一个是类型 第二个参数为std::ratio
ratio 第二个参数默认为秒  具体时间为参数1除以参数2
ratio<1,2> 表示0.5秒 而ratio<3600,1>则表示1h
************************************************/
void test2()
{
	demo();
	std::chrono::seconds sec2(2);
	std::this_thread::sleep_for(sec2);

	demo();

	std::chrono::milliseconds ms4 = sec2 * 2;
	std::this_thread::sleep_for(ms4);
	demo();
	std::cout << sec2.count() << std::endl;
	std::cout << ms4.count() << std::endl; //按照自己的时钟周期打印

	std::chrono::duration> sec_0_5(1); //自定义时间
	auto sec3 = sec_0_5 * 6;
	std::this_thread::sleep_for(sec3);
	demo();
	std::cout << sec3.count() << std::endl; //按照自己的时钟周期打印
}

/***********************************************
	std::chrono::XXX定义的变量可以做差值
************************************************/

void test3()
{
	std::chrono::minutes min3(3);
	std::chrono::seconds sec3(3);
	//auto secdiff = min3 - sec3; 等价下面
	std::chrono::seconds secdiff = min3 - sec3;
	std::cout << secdiff.count() << std::endl;
}

/***********************************************
time_point_cast 类型抓换
time_since_epoch 配合上面可以实现不同类型的时间戳
************************************************/

void test4()
{
	using namespace std::chrono;
	typedef std::chrono::duration> day_type;
	time_point today = time_point_cast(system_clock::now());
	time_pointtoday_s = time_point_cast(system_clock::now());
	std::cout << today.time_since_epoch().count() << std::endl;
	long long int a = (long long int)today_s.time_since_epoch().count();
	std::cout << a << std::endl;

}

/***********************************************
	system_clock::time_point 是一个类
	通过 to_time_t 返回一个longlong 类型
	通过locatime 变为结构体 再通过put_time 返回一个流

************************************************/
void test5()
{
	using namespace std::chrono;
	system_clock::time_point now = system_clock::now();
	std::time_t last = system_clock::to_time_t(now - 24h);
	std::ostringstream ostring;
	ostring << std::put_time(std::localtime(&last), "%F %T");  //put_time 可以用流来保存
	std::string str = ostring.str();
	std::cout << str << std::endl;
}


void test6()
{
	std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now();
	/*std::chrono::seconds sec(1)
	std::this_thread::sleep_for(sec);*/
	/*using namespace std::chrono;
	std::this_thread::sleep_for(1us);*/
	std::this_thread::sleep_for(std::chrono::seconds(1));
	auto t2 = std::chrono::system_clock::now();
	std::cout << (t2 - t1).count() << std::endl;
	long long differ_ms = std::chrono::duration_cast(t2 - t1).count();
	std::cout << differ_ms << std::endl;

}

/***********************************************
	实现一个计时器,可以通过不同类型输出
************************************************/
class Timer
{
public:
	Timer() :_begin(std::chrono::high_resolution_clock::now()) { }

	void reset() { this->_begin = std::chrono::high_resolution_clock::now(); }


	template 
	int64_t elapsed() const
	{
		return std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - this->_begin).count();
	}

	int64_t elapsed_ns() const
	{
		return elapsed();
	}
	int64_t elapsed_us() const
	{
		return elapsed();
	}
	int64_t elapsed_sec() const
	{
		return elapsed();
	}
	int64_t elapsed_min() const
	{
		return elapsed();
	}

	int64_t elapsed_hour() const
	{
		return elapsed();
	}

private:
	std::chrono::time_point _begin;

};


void test7()
{
	Timer t;
	std::this_thread::sleep_for(std::chrono::seconds(2));
	std::cout << t.elapsed() << std::endl;
	std::cout << t.elapsed_us() << "  " << t.elapsed_min() << "  " << t.elapsed_us() << std::endl;

}




int main()
{
	test7();
	return 0;
}

你可能感兴趣的:(modern,c++,c++,算法)