Administrator
发布于 2025-08-29 / 24 阅读
0
0

时间处理库std::chrono

1、 std::chrono

前言: 最近项目中频繁用std::chrono,使用起来特别灵活,避免了传统时间函time()的类型混淆问题,记录下使用过程中的理解。

std::chrono是C++11引入的时间处理库,提供了一套类型安全的时间处理工具,用于测量时间间隔、处理时间点和执行时间相关计算。C++20添加了日志和时区支持。

三大核心组件
  • 时钟(Clocks)std::chrono提供了几种类型的时钟

1. system_clock:系统范围的实时时钟,可以转换为日历时间

2. steady_clock:单调时钟,保证时间不会减少,适合测量时间间隔

3. high_resolution_clock:最高精度的时间,通常steady_clocksystem_clock的别名

  #include <chrono>

std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();

- 时间点(Time Points):表示特定时钟上的一个时间点,是时钟和持续时间组合的模板类

- 持续时间(Durations):表示时间间隔,由数值和单位组成

std::chrono::duration<int,ratio<1,1>> seconds(5);//5秒

std::chrono::duration<int,ratio<60,1>> minutes(1.5);//1.5分钟##### 常用操作

- 测量代码执行时间

std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();

//要测量的代码

std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();

std::chrono::dutation dutation= std::chrono::dutation_cast<millisenconds>(end-start);

cout<<"耗时:"<<dutation.count()<<"毫秒"<<endl;

- 时间点运算

/*

  预定义:

  nanoseconds

  microseconds

  milliseconds

  seconds

  minutes

  hours

  */  
auto now = std::chrono::system_clock::now();

auto one_hour_later = now + std::chrono::hours(1);

auto ten_minutes_ago = now - std::chrono::minutes(10);

- 持续时间转换

 std::chrono::millisenconds ms(1500);

//1秒截断:当持续时间 达到或超过1秒 但不足2秒时,转换为 seconds 会截断为 1

std::chrono::senconds sen = std::chrono::duration_cast<std::chrono::senconds>(ms);//1秒(截断)

//0秒截断:当持续时间 不足1秒 时,转换为 seconds 会直接截断为 0

std::chrono::milliseconds ms(500);       // 500毫秒(0.5秒)

std::chrono::seconds sec = std::chrono::duration_cast<std::chrono::seconds>(ms); 

- 系统时钟与日历时间转换

auto now = std::chrono::system_clock::now();
time_t now_time = std::chrono::system_clock::to_time_t(now);
auto tp = std::chrono::system_clock::from_time_t(now_time);


评论