chrono是在std下,属于C++11的标准,它的头文件为#include<chrono>,是一个处理时间的元素。主要包括三个概念:
- Durantions:时间段
- Time points:时间点
- Clocks:包括system_clock(系统时钟),steady_clock(稳定时钟);high_resolution_clock(高精度时钟);
1. Durations
std::chrono::duration表示一段时间,它的模板类型为:
template <class Rep, class Period = ratio<1> > class duration;
- Rep:算术类型,比如int,float,double。
- Period:时间单位,为ratio类型。默认类型以秒为单位。
- 可以使用内部的.count函数对它进行使用。
常用的duration<REP,Period>类型如下:
type | Representation | Period |
---|---|---|
hours | signed integral type of at least 23 bits | ratio<3600,1> |
minutes | signed integral type of at least 29 bits | ratio<60,1> |
seconds | signed integral type of at least 35 bits | ratio<1,1> |
milliseconds | signed integral type of at least 45 bits | ratio<1,1000> |
microseconds | signed integral type of at least 55 bits | ratio<1,1000000> |
nanoseconds | signed integral type of at least 64 bits | ratio<1,1000000000> |
使用举例:
#include <iostream> // std::cout
#include <chrono> // std::chrono::seconds, std::chrono::milliseconds// std::chrono::duration_cast
int main ()
{using namespace std::chrono;// std::chrono::milliseconds is an instatiation of std::chrono::duration:milliseconds foo (1000); // 1 second,1000微秒foo*=60;std::cout << "duration (in periods): ";std::cout << foo.count() << " milliseconds.\n";std::cout << "duration (in seconds): ";std::cout << foo.count() * milliseconds::period::num / milliseconds::period::den;
//den表示分母,num表示分子,ratio的单位是秒
//所以milliseconds::period::num=1000,milliseconds::period::den = 1;//所以num/den表示千分之一
//同理hours::period::num = 1;hours::period::den = 3600;最好用作比例std::cout << " seconds.\n";return 0;
}
输出结果:
- ratio类型(默认:秒)
它的模板类型为
template <intmax_t N, intmax_t D = 1> class ratio;
ratio表示分数值,N表示分子,D表示分母。
定义自己的period,比如ratio<1,-2>,表示的单位是-0.5秒。
ratio<60, 1> 表示60s,参考上面的标准类型表。
Durations&ratio举例
// duration constructor
#include <iostream>
#include <ratio>
#include <chrono>
int main ()
{typedef std::chrono::duration<int> seconds_type;//默认为秒typedef std::chrono::duration<int,std::milli> milliseconds_type;typedef std::chrono::duration<int,std::ratio<60*60>> hours_type;hours_type h_oneday (24); // 24hseconds_type s_oneday (60*60*24); // 86400smilliseconds_type ms_oneday (s_oneday); // 86400000ms,强制类型转换seconds_type s_onehour (60*60); // 3600s
//hours_type h_onehour (s_onehour); // NOT VALID (type truncates), use:hours_type h_onehour (std::chrono::duration_cast<hours_type>(s_onehour));//强制类型转换//上面的强制类型转换,说明大单位可以转小单位,小单位转大单位必须使用duration_castmilliseconds_type ms_onehour (s_onehour); // 3600000ms (ok, no type truncation)std::cout << ms_onehour.count() << "ms in 1h" << std::endl;//count为duration的成员函数,有多少微秒、秒。。return 0;
}
2. Time points
std::chrono::time_point 表示一个具体时间,它的模板类型为:
template <class Clock, class Duration = typename Clock::duration> class time_point;
- time_point应用举例
time_point有一个函数time_from_eproch()用来获得1970年1月1日8:00:00到time_point时间经过的duration。
下面用到了C语言中的ctime。
// time_point constructors
#include <iostream>
#include <chrono>
#include <ctime>
int main ()
{using namespace std::chrono;time_point <system_clock,duration<int>> tp_seconds (duration<int>(1));//系统经历了一秒的时间点,系统时间1970年开始算system_clock::time_point tp (tp_seconds);//获取时间点std::cout << "1 second since system_clock epoch = ";std::cout << tp.time_since_epoch().count();//经历的clockstd::cout << " system_clock periods." << std::endl;// display time_point:std::time_t tt = system_clock::to_time_t(tp);//经历了一秒的标准时间std::cout << "time_point tp is: " << ctime(&tt);return 0;
}
- 经历了多少天
#include <iostream>
#include <ratio>
#include <chrono>
int main ()
{using namespace std::chrono;typedef duration<int,std::ratio<60*60*24>> days_type;//表示一天time_point<system_clock,days_type> today = time_point_cast<days_type>(system_clock::now());std::cout << today.time_since_epoch().count() << " days since epoch" << std::endl;return 0;
}
- 记录一段时间,并写到txt文件
#include <iostream> // std::cout
#include <chrono> // std::tuple, std::make_tuple, std::tie
using namespace std;
int main ()
{
ofstream fout("/home/../工作资料/测试时间/buildStructure.txt");;//创建输出流对象chrono::steady_clock::time_point t1 = chrono::steady_clock::now();chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double,std::milli> time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//毫秒
fout << time_used.count()<<endl;t1 = chrono::steady_clock::now();
t2 = chrono::steady_clock::now();
time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);return 0;
}
3. Clocks
Clock类获取的是当前的time_point。
- std::chrono::system_clock获取的是当前的系统时钟.system_clock是不稳定的。因为时钟是可调的,即这种是完全自动适应本地账户的调节;
- std::chrono::steady_clock可以用来获取程序运行时间差;
- std::chrono::high_resolution_clock精度最高,它也可能是上面两个类型的代名词。
常用函数:
- 成员函数now():用于获取系统的当前时间。
- to_time_t(): time_point转换成time_t秒
- from_time_t():从time_t转换成time_point
- system_clock举例
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>int main ()
{using std::chrono::system_clock;std::chrono::duration<int,std::ratio<60*60*24> > one_day (1);system_clock::time_point today = system_clock::now();system_clock::time_point tomorrow = today + one_day;std::time_t tt;tt = system_clock::to_time_t ( today );//转换成ctime标准类型std::cout << "today is: " << ctime(&tt);tt = system_clock::to_time_t ( tomorrow );std::cout << "tomorrow will be: " << ctime(&tt);return 0;
}
- steady_clock举例
// steady_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>int main ()
{using namespace std::chrono;steady_clock::time_point t1 = steady_clock::now();std::cout << "printing out 1000 stars...\n";for (int i=0; i<1000; ++i) std::cout << "*";std::cout << std::endl;steady_clock::time_point t2 = steady_clock::now();duration<double> time_span = duration_cast<duration<double>>(t2 - t1);std::cout << "It took me " << time_span.count() << " seconds.";std::cout << std::endl;return 0;
}
4. chrono与ctime格式转换
参考代码:
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>int main ()
{using std::chrono::system_clock;std::chrono::duration<int,std::ratio<60*60*24> > one_day (1);system_clock::time_point today = system_clock::now();system_clock::time_point tomorrow = today + one_day;std::time_t tt_today, tt_tomorrow;/********chrono转ctime*********/tt_today = system_clock::to_time_t ( today );//转time_tstd::cout << "today is: " << ctime(&tt_today);tt_tomorrow = system_clock::to_time_t ( tomorrow );std::cout << "tomorrow will be: " << ctime(&tt_tomorrow);/************ctime转chrono***************/system_clock::time_point tp_tomorrow = system_clock::from_time_t (tt_tomorrow);system_clock::time_point tp_today = system_clock::from_time_t (tt_today);system_clock::duration d = tp_tomorrow - tp_today;typedef std::chrono::duration<int,std::ratio<60*60>> hours_type;hours_type nhours = std::chrono::duration_cast<hours_type> (d);std::cout<<"tomorrow duration: " << nhours.count() <<std::endl;return 0;
}
参考:
chrono参考:http://www.cplusplus.com/reference/chrono/