简介
chrono头文件是C++中用于解决关于时间问题的头文件,他主要由三个概念来实现。
一.时钟(Clocks)
时钟是将时间点和物理上的时间关联起来的框架。在这个库文件里,提供了3个时钟。分别是系统时钟(system_clock),稳定时钟(steady_clock)和高精度时钟( high_resolution_clock) 。
1.系统时钟
通过这个类可以获取现在的系统时间,他有以下三个静态函数

chrono::system_clock::now //获取当前时间点(time_point) chrono::system_clock::to_time_t //将时间点转换为time_t类型 chrono::system_clock::from_time_t //将time_t类型转化为时间点
实例:获取当前日期

#include<iostream> #include<ctime> #include<chrono> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); auto now = chrono::system_clock::now(); auto tmp = chrono::system_clock::to_time_t(now); cout<<ctime(&tmp)<<endl; //Thu Apr 09 21:48:26 2020 return 0; }
2.稳定时钟
这个时钟一般用来计算时间差,如代码运行时间。
实例:

#include<iostream> #include<ctime> #include<chrono> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); auto st = chrono::steady_clock::now(); for(int i=0;i<1e6;i++) int tmp; auto ed = chrono::steady_clock::now(); auto cost = chrono::duration_cast<chrono::duration<double>> (ed-st); //默认是微妙,将其转化为秒 cout<<cost.count()<<'s'<<endl; return 0; }
3.高精度时钟
其内部时间刻度比其他两个时钟更短,精确度更高。
二.时间点(time_point)
用于表示一个相对于时钟纪元(1970年1月1日0时0分0秒)的时间点
三.时间间隔(duration)
表示时间间隔,如1秒,1天等,这里是他的一些别名
相互之间的联系
时间间隔(duration)代表着两个时间点(time_point)之差。只有在同一个时钟下的时间间隔才有意义。
如何使用时间间隔(duration)
duration的构造函数
- duration()
- duration (const duration& dtn);
-
template<class Rep2, class Period2>
constexpr duration (const duration<Rep2,Period2>& dtn); -
template<class Rep2>
constexpr explicit duration (const Rep2& n);
类模板参数中的Rep2指的是数据类型如int等,用于表示间隔差的数据类型,Period2指间隔周期与1s的比值,1s可以用ratio<1,1>表示,1小时可以用ratio<3600,1>表示
chrono::hours hour(10); //声明10个小时的时间间隔 chrono::duration<int64_t,ratio<3600,1>> h(10); //声明10个小时的时间间隔
时间间隔之间的单位转化
chrono::duration<long long,ratio<1,1>> s(60); auto res = chrono::duration_cast<chrono::minutes>(s); //将其转化为以分钟为单位 cout<<res.count()<<endl; // 1
如何使用时间点(time_point)
构造函数
- time_point();
-
template <class Duration2>
time_point (const time_point<clock,Duration2>& tp); - explicit time_point (const duration& dtn);
构造一个使用系统时钟的时间点
chrono::time_point<chrono::system_clock,chrono::seconds> tp1(chrono::seconds(50)); // 相对于1970.01.01.00.00.00增加了50秒
auto time = chrono::system_clock::to_time_t(tp1); // 将时间点转化为time_t类型
cout<<ctime(&time)<<endl; // Thu Jan 01 08:00:50 1970 由于我们时区是UTC+8,所以结果会增加8小时
计算两个时间点的差值
chrono::time_point<chrono::system_clock,chrono::minutes> tp1(chrono::minutes(50)); // chrono::time_point<chrono::system_clock,chrono::hours> tp2(chrono::hours(1)); auto res = tp2-tp1; cout<<res.count()<<endl; // 10分钟