c++ 学习笔记之 chrono库

文章目录


前言

chrono 库主要包含3种类型:duration (时间间隔)、clock (时钟)与time point(时间点)。


1、记录时长的duration

duration 表示一段时间间隔,可以表示几秒、几分钟、或者几个小时的时间间隔。
duration是一个模板类,其定义如下:

cpp 复制代码
template <class Rep, class Period = ratio<1>>
class duration;

Rep 表示计数的类型(必须是算术类型,如int, double等),Period 表示单位,是一个ratio(比例),默认为秒。

ratio定义如下:

cpp 复制代码
template <intmax_t _Nx, intmax_t _Dx = 1>
struct ratio { // holds the ratio of _Nx to _Dx
    //.......
};

ratio 代表每个时钟周期的秒数,是一个比例。其中**_Nx代表分自, _Dx 代表分母且默认为1。譬如:ratio<2>代表2秒,ratio<60>代表一分钟,ratio<1,1000>代表1ms。
chrono已经定义好了常见
duration**:

cpp 复制代码
     using nanoseconds  = duration<long long, nano>;
     using microseconds = duration<long long, micro>;
     using milliseconds = duration<long long, milli>;
     using seconds      = duration<long long>;
     using minutes      = duration<int, ratio<60>>;
     using hours        = duration<int, ratio<3600>>;
//c++20
     using days   = duration<int, ratio_multiply<ratio<24>, hours::period>>;
     using weeks  = duration<int, ratio_multiply<ratio<7>, days::period>>;
     using years  = duration<int, ratio_multiply<ratio<146097, 400>, days::period>>;
     using months = duration<int, ratio_divide<years::period, ratio<12>>>;

使用起来也非常方便:

cpp 复制代码
 std::chrono::seconds s(5);          // 5s
 std::chrono::milliseconds ms(1500); // 1500ms
 std::this_thread::sleep_for(std::chrono::seconds(3)) //休眠3s
 std::this_thread::sleep_for(std::chrono::milliseconds(600))//休眠600ms

时间间隔之间可以运算,当两个不同的duration进行运算时,会触发隐式转换。

cpp 复制代码
 std::chrono::seconds s(5);          // 5s
 std::chrono::milliseconds ms(1500); // 1500ms
 auto total_ms = s + ms;             // 5秒 + 1500毫秒 = 6500毫秒(milliseconds)
 std::cout << "总毫秒数:" << total_ms.count() << std::endl; // count() 返回数值:6500 chrono提供获取duration的方法count(),

从大单位到小单位的转换可以隐式进行,而从小单位到大单位的转换必须显式使用duration_cast<>(),当然,尽量避免隐式转换。

cpp 复制代码
 std::chrono::seconds s(5);          // 5s
 std::chrono::milliseconds ms(1500); // 1500ms
 auto s_from_ms = std::chrono::duration_cast<std::chrono::seconds>(ms);
 std::cout << "1500毫秒转换为秒:" << s_from_ms.count() << std::endl; // 1秒(向下取整)

2、clock(时钟)

clock表示当前的系统时钟,主要包含以下3中时钟:

时钟类型 特点 适用场景
std::chrono::system_clock 系统时钟(可被系统修改,如手动调时间),精度中等 记录日历时间(年月日时分秒)
std::chrono::steady_clock 稳定时钟(单调递增,不受系统时间修改影响),精度高 计算时间间隔(如程序耗时)
std::chrono::high_resolution_clock 高精度时钟(通常是 steady_clock 或 system_clock 的别名) 高精度计时
  1. now()方法获取当前时间点:
cpp 复制代码
std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now();
std::cout<<"这里是一段代码\n";
std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now();
std::cout << (t2 - t1).count() << "\n";//2020
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << "\n";//202微秒
  1. to_time_to()方法可以将一个time_point转换为ctime;
cpp 复制代码
auto now = std::chrono::system_clock::now();
// 转换为time_t
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::cout << std::ctime(&t);  // 输出可读时间 Wed Jan 21 16:30:04 2026

3.from_time_to() 方法可以将一个ctime转换为time_point

steady_clock可以稳定获取可靠的时间间隔,不会因为系统时间的改变而导致后一次调用now()的值和前一次调用的差值。steady_clock和std::put_time 结合使用可以格式化日期:

cpp 复制代码
auto now = std::chrono::system_clock::now();
// 转换为time_t
std::time_t t = std::chrono::system_clock::to_time_t(now);

std::cout << std::put_time(std::localtime(&t),"%Y-%m-%d %X")<<"\n";  // 2026-01-21 16:45:16
std::cout << std::put_time(std::localtime(&t), "%Y-%m-%d %H.%M.%S") << "\n";//2026-01-21 16.45.16

3、time point(时间点)

std::chrono::time_point 是模板类,定义:

cpp 复制代码
template <typename Clock, typename Duration = typename Clock::duration>
class time_point;

Clock:关联的时钟(如 system_clock)

Duration:时间点相对于时钟纪元(epoch)的时长(如 system_clock 的纪元通常是 1970-01-01 00:00:00 UTC)

time_point必须用clock来计时。

cpp 复制代码
	auto now = std::chrono::system_clock::now();
	auto epoch = std::chrono::time_point<std::chrono::system_clock>{};

	auto later = now + std::chrono::hours(24);//可以和一个duration相加
	auto earlier = now - std::chrono::minutes(30);

	auto since_epoch = now.time_since_epoch();//time_since_epoch()获取相对于纪元的时间间隔
	auto ms_since_epoch = std::chrono::duration_cast<
		std::chrono::milliseconds>(since_epoch);

	if (now < later) {
		std::cout << "now 在 later 之前\n";
	}
相关推荐
布莱克6052 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
前进的李工4 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
正在走向自律6 小时前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
蒸蒸yyyyzwd6 小时前
后端学习笔记三个知识
笔记·八股
沫璃染墨6 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
CCIE-Yasuo7 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
La Pulga8 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
Zhao-Jichao8 小时前
AI Prompting for Everyone 课程笔记 - P19 数据分析 Data Analysis
人工智能·笔记·数据分析
li星野8 小时前
【学习记录】逻辑分析仪完全入门:从品牌方案到采样率、存储深度的核心概念解析
学习