C++11开始提供了对日期和时间进行操作的库chrono,该库提供的时钟类有3个,分别是system_clock、steady_clock和high_resolution_clock。其中,system_clock和high_resolution_clock是实时时钟(real time clock),会随如夏零时(在夏季把标准时间拨早1小时)这样的真实世界的时间的调整而改变,而steady_clock是单调时钟(monotonic clock),不随外界时间调整而改变。
输出时间点
当需要输出具体的时间点时,这3种时钟均通过成员函数now获得其数据成员的时间点time_point,但在一般情况下,需要输出现实世界的时间,因此宜采用system_clock和high_resolution_clock。这二者的区别在于后者的精度更高。
将时间以标准日历形式输出时,需要使用时钟类的成员函数to_time_t将now成员函数获取的时间点time_point转换成time_t类型,然后通过库函数gmtime将time_t类型时间转换成日历时间,最后使用iomanip库中的put_time函数将日历时间转换成各种时间书写形式的标准输出流。
using namespace chrono;
time_t tt = system_clock::to_time_t(system_clock::now());
/*put_time的第二个参数中的格式控制符F表示“%Y - %M - %d”格式日期,T表示“%H:%M:%S”格式时间*/
cout << put_time(gmtime(&tt)), "% F % T") << endl; //2023 - 06 - 09 11:45:08
输出时间间隔
在运行某种算法时常常需要知道它的时耗,在chromo库中有一个专门的类duration用来表示时间段。前后两个时间点time_point的相减运算得到的结果就是duration类型。在输出时间间隔时,还需要通过一个转换函数duration_cast将时间段转换成特定的时间单位,如毫秒、小时等,最后使用duration的成员函数count获取最终结果。
/*考虑到测量时间间隔需要稳定不变的时钟,代码中使用的时钟是steady_clock*/
auto start = steady_clock::now();
doSometing(); //执行某种算法
auto end = steady_clock::now();
auto interval = duration_cast<milliseconds>(end - start);
cout << interval.cout() << endl;