通过函数+注释来解释,chrono库的基本用法
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <chrono>
#include <ctime>
#include <string>
#include <iomanip>
#include <thread>
#include <ratio>
#include <sstream>
/***********************************************
一个简单的计算时间差值的函数,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<double, std::ratio<1, 2>> 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<int, std::ratio<24 * 60 * 60>> day_type;
time_point<system_clock, day_type> today = time_point_cast<day_type>(system_clock::now());
time_point<system_clock, std::chrono::milliseconds>today_s = time_point_cast<std::chrono::milliseconds>(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<std::chrono::milliseconds>(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 <typename Duration = std::chrono::milliseconds>
int64_t elapsed() const
{
return std::chrono::duration_cast<Duration>(std::chrono::high_resolution_clock::now() - this->_begin).count();
}
int64_t elapsed_ns() const
{
return elapsed<std::chrono::nanoseconds>();
}
int64_t elapsed_us() const
{
return elapsed<std::chrono::microseconds>();
}
int64_t elapsed_sec() const
{
return elapsed<std::chrono::seconds>();
}
int64_t elapsed_min() const
{
return elapsed<std::chrono::minutes>();
}
int64_t elapsed_hour() const
{
return elapsed<std::chrono::hours>();
}
private:
std::chrono::time_point<std::chrono::high_resolution_clock> _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;
}