时间模块 chrono

导航

时间模块 chrono#

chrono 库,包含一系列和时钟、日期相关的功能。

#include <iostream>
#include <chrono>
#include <thread>
using namespace std::chrono;

chrono 库里包括三种主要类型:clocks,time points 和 durations。

一个时钟(clock)包含了两部分:时钟原点和时钟节拍。时钟原点通常是 1970-01-01 00:00:00 UTC,一段时间的时钟节拍数除以振动频率,可以得到这段时间的具体时间。

C++ 定义了三种类型的时钟:

  • std::chrono::system_clock:本地系统的当前时间(可以调整)

  • std::chrono::steady_clock:不能被调整的,稳定增加的时间。表示过去某个时间点到现在之间的时间,这个时间不能被调整,物理时间增加,它一定增加,而且与系统时间无关(可以是系统重启以来的时间段),最适合于计算程序的耗时时长。

  • std::chrono::high_resolution_clock:高精度的计时周期

每个 clock 类中都有确定的 time_pointdurationRepPeriod 类型,这些类型后面都会讲到。

std::chrono::system_clockstd::chrono::steady_clock 时钟类都提供了静态成员函数 now() 用于获取当前时间,该函数的返回值都是 time_point 类型,system_clock 还另外提供了两个支持系统时间和 std::time_t 相互转换的静态成员函数:to_time_t()() 和 from_time_t()

获取时间间隔可以:

time_point<system_clock> start = system_clock::now();
// 模拟耗时
std::this_thread::sleep_for(std::chrono::seconds(2));
time_point<system_clock> end = system_clock::now();
// 获取间隔时间
std::chrono::duration<double> elapsed = end - start;
// 打印时间信息
std::cout << "运行时间: " << elapsed.count() << "s";
运行时间: 2.00015s

sleep_for 用于使主线程休眠,休眠时间由 std::chrono::seconds() 控制。

也可以查看系统时间:

auto t = std::chrono::system_clock::now();
std::time_t tt = std::chrono::system_clock::to_time_t(t);
std::string stt = std::ctime(&tt);
std::cout << stt; // 默认格式
std::tm* now = std::gmtime(&tt);
std::cout << now->tm_year+1900 << " 年 "
          << now->tm_mon+1 << " 月 "
          << now->tm_mday << " 日 "
          << now->tm_hour << " 时 "
          << now->tm_min << " 分 "
          << now->tm_sec << " 秒 ";
Thu Sep 29 10:54:37 2022
2022 年 9 月 29 日 10 时 54 分 37 秒 

持续时间#

std::chrono::duration 是模板类,从名字都可以看出来,它表示时间间隔。

使用参数 RepPeriod 共同表示时间间隔。

  • Rep 用于指定数值类型,表示节拍的数量;

  • Period 属于 std::ratio 类型,表示单位精度,用来计算一个节拍的周期,std::ratio 是分数类型的模板类,包含分子(Num)和分母(Denom)两部分。

time_point<steady_clock> start = steady_clock::now();
// 模拟耗时
std::this_thread::sleep_for(std::chrono::seconds(2));
time_point<steady_clock> end = steady_clock::now();
// 获取间隔时间
std::chrono::duration<double> elapsed = end - start;
// 打印时间信息
std::cout << "运行时间: " << elapsed.count() << "s";
运行时间: 2.00016s