目录
一、std::chrono::duration:表示时间间隔(时长)
二、std::chrono::time_point:表示时间点
std::chrono::duration 和 std::chrono::time_point 是 C++11 引入的 <chrono> 库中两个核心概念,用于精确表示 “时间间隔” 和 “时间点”,是时间处理的基础。
一、std::chrono::duration:表示时间间隔(时长)
duration 用于描述两个时间点之间的间隔(如 “2 秒”“500 毫秒”“3 纳秒”),本质是 “一个数值 + 时间单位” 的组合。
1. 核心定义
模板定义:
template <typename Rep, typename Period = std::ratio<1>>
class duration;
Rep:存储时间间隔的数值类型(如int、long long,通常是整数或浮点数)。Period:时间单位(以秒为基准的比例,由std::ratio定义)。例如:std::ratio<1>:1 秒(单位s)。std::ratio<1, 1000>:1/1000 秒 = 1 毫秒(单位ms)。std::ratio<1, 1000000>:1 微秒(us)。std::ratio<60>:60 秒 = 1 分钟(min)。
2. 标准预定义的 duration 类型
为简化使用,标准库定义了常用时间单位的 duration 别名:
| 类型 | 含义(单位) | Period 定义 |
|---|---|---|
nanoseconds | 纳秒(ns) | std::ratio<1, 1000000000> |
microseconds | 微秒(μs) | std::ratio<1, 1000000> |
milliseconds | 毫秒(ms) | std::ratio<1, 1000> |
seconds | 秒(s) | std::ratio<1> |
minutes | 分钟(min) | std::ratio<60> |
hours | 小时(h) | std::ratio<3600> |
3. 常用操作
-
创建 duration:
using namespace std::chrono; seconds s(10); // 10秒 milliseconds ms(500); // 500毫秒 nanoseconds ns = 100ns; // 100纳秒(C++14起支持字面量) -
算术运算(支持加减、乘除标量):
auto total = s + ms; // 10秒 + 500毫秒 = 10500毫秒(自动转换单位) auto half = s / 2; // 5秒 auto doubled = ms * 2; // 1000毫秒 = 1秒 -
单位转换(通过
duration_cast显式转换):// 将500毫秒转换为秒(结果为0秒,因为整数截断) seconds s2 = duration_cast<seconds>(milliseconds(500)); // 将1.5秒转换为毫秒(需用浮点数存储) using FloatMs = duration<double, std::milli>; FloatMs ms2 = seconds(1) + milliseconds(500); // 1500.0 ms
4. 应用场景
- 表示 “持续时间”(如函数执行耗时、线程睡眠时长)。例:
std::this_thread::sleep_for(500ms);(线程睡眠 500 毫秒)。
二、std::chrono::time_point:表示时间点
time_point 用于描述一个具体的时间点(如 “2024-10-21 12:00:00”“程序启动后第 3 秒”),本质是 “相对于某个时钟起点的 duration”。
1. 核心定义
模板定义:
template <typename Clock, typename Duration = typename Clock::duration>
class time_point;
Clock:关联的时钟(如steady_clock、system_clock),决定了时间点的 “起点”(epoch)和计时规则。例如:system_clock的起点通常是 “1970-01-01 00:00:00 UTC”。Duration:时间点相对于时钟起点的间隔(默认使用时钟的原生duration)。
2. 常用操作
-
获取当前时间点(通过时钟的
now()方法):auto now = system_clock::now(); // system_clock 的当前时间点 -
时间点加减 duration(得到新的时间点):
auto later = now + hours(1); // 1小时后的时间点 auto earlier = now - minutes(30); // 30分钟前的时间点 -
计算两个时间点的间隔(结果为
duration):auto diff = later - now; // 间隔为 3600 秒 auto diff_ms = duration_cast<milliseconds>(diff).count(); // 转换为毫秒 -
转换为日历时间(仅
system_clock支持):std::time_t tt = system_clock::to_time_t(now); // 转换为传统时间类型 std::cout << "当前时间: " << std::ctime(&tt); // 输出人类可读时间
3. 应用场景
- 记录事件发生的具体时刻(如日志时间戳、程序启动时间)。
- 测量时间间隔(用两个时间点相减得到
duration)。
三、duration 与 time_point 的关系
- 类比:
duration如同 “100 米”(只表示长度,无起点)。time_point如同 “距离起点 100 米的位置”(基于某个起点的长度)。
- 核心关联:两个
time_point相减得到duration(间隔);一个time_point加上duration得到新的time_point。
四、总结
| 类型 | 含义 | 核心作用 | 关键关联 |
|---|---|---|---|
std::chrono::duration | 时间间隔(时长) | 表示 “多久”,如 “2 秒”“500ms” | 支持算术运算和单位转换 |
std::chrono::time_point | 具体时间点 | 表示 “何时”,如 “当前时间”“3 小时后” | 依赖时钟的起点,与 duration 可加减 |
理解这两个类型是掌握 <chrono> 库的基础,它们共同提供了类型安全、高精度的时间处理能力,避免了传统 time_t 等类型的精度不足和单位混乱问题。

1万+

被折叠的 条评论
为什么被折叠?



