C++ 进阶(20):时间库——chrono 深入、duration、time_point、时钟
更新时间:2026-09-01。本文是
languages/cpp/intermediate/进阶第 20 篇,接 内存池。C++11 引入了<chrono>库,C++20 大幅扩展。不再用time()和clock(),用类型安全的时间库。
本文要回答的问题
- duration 的算术怎么算?不同单位怎么转换?
- time_point 怎么计算时间差?怎么和 duration 配合?
- system_clock、steady_clock、high_resolution_clock 有什么区别?
- C++20 的时间格式化怎么用?
一、duration:时间长度
cpp
#include <chrono>
using namespace std::chrono_literals;
// 定义时长
auto d1 = 5s; // 5 秒
auto d2 = 100ms; // 100 毫秒
auto d3 = 3min; // 3 分钟
auto d4 = 2h; // 2 小时
// 算术
auto total = 5s + 100ms; // 5.1s
auto half = 5s / 2; // 2.5s
auto count = 5s / 1s; // 5(整数倍)
// 单位转换
auto ms = duration_cast<milliseconds>(5s); // 5000ms
auto s = duration_cast<seconds>(1000ms); // 1s
auto ns = duration_cast<nanoseconds>(1s); // 1'000'000'000ns
// 浮点转换
auto f = duration<double>{1.5}; // 1.5s二、time_point:时间点
cpp
// 当前时间
auto now = system_clock::now();
auto start = steady_clock::now();
// 时间点计算
auto tp = now + 5s; // 5 秒后
auto diff = tp - now; // 5s(duration)
// 耗时测量
auto begin = steady_clock::now();
do_something();
auto end = steady_clock::now();
auto elapsed = duration_cast<microseconds>(end - begin);
cout << "耗时: " << elapsed.count() << "us\n";三、三种时钟
| 时钟 | 特性 | 用途 |
|---|---|---|
system_clock | 系统时间,可被调整 | 日历时间、文件时间戳 |
steady_clock | 单调递增,不可调 | 性能测量、超时 |
high_resolution_clock | 最高精度,通常是 steady_clock 别名 | 微基准测试 |
cpp
// system_clock:可被 NTP 调整,不适合测量间隔
auto sys_now = system_clock::now();
// steady_clock:单调递增,适合测量
auto start = steady_clock::now();
// ...
auto end = steady_clock::now();四、C++20 时间格式化
cpp
#include <chrono>
#include <format>
auto now = system_clock::now();
// 格式化输出
cout << format("{:%Y-%m-%d %H:%M:%S}", now); // 2026-09-01 10:00:00
cout << format("{:%F %T}", now); // 同上
// 时长格式化
cout << format("{}", 5h + 30min); // 5h 30min五、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| 用 system_clock 测量耗时 | 系统时间调整导致测量错误 | 用 steady_clock |
| 忘记 duration_cast | 编译报错,不同单位不隐式转换 | 用 duration_cast 或浮点 duration |
| 用 count() 取整 | 丢失精度,比如 1.5s 变成 1 | 用浮点 duration |
| C++17 用不了 format | 编译报错 | 用 fmt 库或 C++20 |
相关与延伸
下一篇:文件系统——filesystem 库;C++20 chrono 的日历和时区,见 C++ 专家层 chrono 深入。
一句话总结
C++ chrono 时间库:duration 是类型安全的时间长度,支持算术和单位转换;time_point 是时间点,两个 time_point 相减得 duration;system_clock 是系统时间(可调),steady_clock 是单调时钟(适合测量),high_resolution_clock 是最高精度;C++20 的 format 可以直接格式化时间;测量耗时用 steady_clock,避免系统时间调整导致测量错误。