一文读懂C++ chrono库: duration, clocks, date, timezone
C++ 的 <chrono>
库提供了一套功能强大且类型安全的时间与日期管理工具. 从 C++11 引入的 std::chrono
, 到 C++20 的增强功能, 开发者可以高效地处理时间间隔, 时间点, 日期和时区. 本篇博客将通过实例讲解这些功能.
分数(std::ratio
)
C++中的std::ratio
是一个模板类, 定义在<ratio>
头文件中, 用于编译期处理有理数(rational number).
它主要用于以高效且类型安全的方式表示和操作以分数形式表示的常量值.
下面是std::ratio
的模板定义
Num
: 分子(整数).Den
: 分母(整数, 默认值为 1).- 分子和分母的值在编译期已约简为最简分数.
定义分数
定义一个分数:
获取分子/分母:
注意这些数值是编译时常量, 不能用普通变量:
运算和比较
标准库提供了一些类型别名和函数支持std::ratio
的比较和运算.
- 算数运算:
ratio_add
,ratio_subtract
,ratio_multiply
,ratio_divide
- 比较运算:
ratio_equal
,ratio_not_equal
,ratio_less
,ratio_less_equal
,ratio_greater
,ratio_greater_equal
预定义的别名
C++标准库提供了一些常用的比例类型别名:
这些别名常与std::chrono
配合使用以表示时间单位.
二. 持续时间 (Durations)
std::duration
是 C++11 引入的一个模板类, 定义在头文件 <chrono>
中, 用于表示和处理时间间隔(持续时间).
它以一个 时间单位 和 数量值 的组合形式, 表示经过的时间长度, 支持灵活的时间单位和类型安全的运算.
定义std::duration
模板定义
Rep
: 表示时间间隔的数值类型(通常为整型或浮点型, 如int
,double
).Period
: 表示时间单位, 默认值为std::ratio<1>
, 即秒.
比如, 定义一秒可以用如下方式:
定义一分钟
支持的操作
算数运算
比较运算
两个时间段相加:
时间单位转换
std::chrono
提供了显式的时间单位转换支持:
- 使用
std::chrono::duration_cast
进行显式转换. - 精度较高的单位可以隐式转换为精度较低的单位(如秒转分钟).
如果转换的时候不安全, 则会编译失败:
如果强转回丢失精度
常见别名和单位
时间字面量
预定义的一些时间字面量: h
, min
, s
, ms
, us
, ns
使用如下的using
语句就可以:
定义一分钟:
三. 时钟 (Clocks)
C++ 中的 clocks(时钟)是用于获取当前时间点或测量时间的工具, 定义在头文件 <chrono>
中.
C++ 提供了多种类型的时钟, 每种都适用于不同的场景, 例如系统时间, 高精度计时和稳定时间测量等.
时钟类型
std::chrono
提供以下时钟:
std::chrono::system_clock
: 系统时钟, 表示系统的当前时间.std::chrono::steady_clock
: 稳定时钟, 表示单调递增的时间, 适合用于测量时间间隔.std::chrono::high_resolution_clock
: 高精度时钟, 通常是steady_clock
或system_clock
的别名, 提供最高可能的计时精度.
每个时钟都提供now()
方法, 用来获取当前时间.
时钟的基本操作
获取当前时间点
或者
输出时间
获取运行耗时
四. 时间点 (Time Points)
在 C++ 的 <chrono>
库中, 时间点(Time Point) 是指在某个时钟(Clock)上的特定时刻.
std::chrono::time_point
是一个模板类, 用于表示某个具体的时间.
定义
Clock
: 时钟类型(如std::chrono::system_clock
,std::chrono::steady_clock
等).Duration
: 时间间隔类型(默认值为对应时钟的duration
), 相对于 epoch(时钟起点).
特点:
std::chrono::time_point
的值由Clock::now()
获取.- 可以通过加减时间间隔(
std::chrono::duration
)进行运算. - 类型安全, 避免混淆不同时间单位.
常用操作
创建时间点
时间点加减时间段:
计算两个时间点的差:
转换为可读时间
时间单位转换
五. 日期 (Dates)
C++ 在 C++20 中引入了 <chrono>
的扩展部分, 用于更高效和类型安全地处理日期(Dates).
这些新功能提供了一套现代化的日期和时间管理接口, 适用于日期的存储, 操作和格式化.
核心概念
std::chrono
命名空间里面定义了: year
, month
, day
, weekday
, weekday_indexed
, weekday_last
, month_day
, year_month
, year_month_day
等日期格式.
常用操作
定义日期
也可以用下面的方式创建
日期加减
格式化日期
sys_days
表示从 1970-01-01
(UTC 的 Unix 时间原点)起的天数, 便于日期的算术操作. 支持的操作有:
获取
sys_days
sys_days
转为time_point
time_point
转为sys_days
六. 时区 (Time Zones)
时区数据库(Timezone database): 获取时区列表.
可以使用std::chrono::get_tzdb()
获取到数据库.
获取特定的时区:
将当前时间转为 GMT 时区时间
或者使用 zoned_time
总结
C++ 的时间和日期库功能强大, 从编译期的比例计算到运行时的时区支持, 都提供了高效, 安全的解决方案. 通过善用这些工具, 可以大大简化时间相关的复杂操作, 并提升代码的可读性与可维护性.
源码链接
Tags: