C++ 标准库 <chrono>的具体使用

 更新时间:2026年02月27日 14:55:04   作者:yingjuxia.com  
chrono>引入于 C++11,提供了类型安全的时间度量体系,本文就来详细的介绍一下<chrono>的使用,感兴趣的可以了解一下

下面对 C++ 标准库中 <chrono> 头文件提供的高精度、类型安全的时间与时钟工具做一次系统、深入的梳理,包括时钟类别、durationtime_point 基础、常用别名、运算与转换、定时与睡眠、格式化/解析,以及实践建议。

一、概述

  • <chrono> 引入于 C++11,提供了类型安全的时间度量体系,替代了传统 C 风格的 <ctime>

  • 核心概念围绕两大模板类:

    • std::chrono::duration<Rep,Period>:表示一段时间长度(例如 3.5 秒、100 毫秒)
    • std::chrono::time_point<Clock,Duration>:表示某一时刻,相对于特定时钟的纪元(epoch)
  • 配合若干 时钟(Clock) 类型,可进行高精度测时、定时、时间点运算、跨平台的线程睡眠等。

二、时钟(Clocks)

时钟类型说明精度单调性
system_clock与系统实时时钟对应,可转换为日历时间(time_t)操作系统定义非单调
steady_clock单调、不可回拨,适合测量间隔,不受系统时间调整影响实现定义单调
high_resolution_clock提供最高可用精度(通常是 steady_clock 或 system_clock)实现定义取决于底层时钟
using namespace std::chrono;
auto t0 = steady_clock::now();
// …执行某些耗时操作…
auto t1 = steady_clock::now();
auto elapsed = t1 - t0;  // 类型为 steady_clock::duration

三、duration:表示时间间隔

1. 定义

template<class Rep, class Period = std::ratio<1>>
class duration;
  • Rep:底层数值类型(如 int64_t、double)

  • Period:刻度单位,以分数形式表示:

    • std::ratio<1,1000> → 毫秒
    • std::ratio<60> → 分钟
    • std::nano/micro/milli/ratio<1>/kilo…

2. 常用别名

using nanoseconds  = duration<long long, nano>;   // 10⁻⁹ s
using microseconds = duration<long long, micro>;  // 10⁻⁶ s
using milliseconds = duration<long long, milli>;  // 10⁻³ s
using seconds      = duration<long long>;         // 1 s
using minutes      = duration<long long, ratio<60>>;
using hours        = duration<long long, ratio<3600>>;

3. 运算与转换

  • 加减乘除:对同种或可转换 duration 之间可直接相加、相减;也可乘以/除以标量。
  • duration_cast<To>(d):将 d 强制转换为 To,会截断精度而非四舍五入。
  • std::chrono::abs(d)(C++20)取绝对值。
auto d1 = 1500ms;                       // milliseconds
auto d2 = 1s + 500ms;                   // 1500ms
auto d3 = duration_cast<seconds>(d1);   // 1s (截断)
auto d4 = d1 * 2;                       // 3000ms

四、time_point:表示时刻

1. 定义

template<class Clock, class Duration = Clock::duration>
class time_point;
  • Clock::duration:决定了 time_point 的底层精度
  • 以时钟的纪元(epoch)为参考,例如 system_clock 通常以 UNIX 纪元 (1970-01-01)

2. 构造与置零

system_clock::time_point t0;            // 默认构造:epoch
auto t1 = system_clock::now();          // 当前时刻

3. 运算

  • 加减 duration:tp + d 或 tp - d 得到新的 time_point
  • 差值:t2 - t1 得到 duration
  • 比较:支持 <,>,== 等
auto expire = t1 + 5min;                // 5 分钟后
if (system_clock::now() < expire) { … }
auto wait = expire - system_clock::now();  // duration

五、定时与线程睡眠

  • std::this_thread::sleep_for(dur):阻塞当前线程持续指定 duration
  • std::this_thread::sleep_until(tp):阻塞至指定 time_point
#include <thread>

std::cout << "Sleeping for 500ms...\n";
std::this_thread::sleep_for(500ms);
std::cout << "Awake!\n";
  • 精度取决于操作系统调度与底层时钟,通常不保证毫秒级精确唤醒。

六、格式化与解析(C++20 起)

C++20 增加了 <chrono> 对日历与格式化的支持,位于 <chrono><chrono> + <format>

#include <chrono>
#include <format>   // C++20
using namespace std::chrono;

auto now = system_clock::now();
auto dp = floor<days>(now);
year_month_day ymd = dp;   // C++20 calendar 类型
auto time_str = std::format("{:%Y-%m-%d %H:%M:%S}", now);
// 例如 "2025-07-12 15:04:05"
  • floor<Duration>(tp):向下取整至指定粒度
  • year_month_day、weekday、month_day 等类型支持日历运算
  • std::format 与 <format> 的时间格式 {:%Y-%m-%d} 与 strftime 类似,更类型安全。

七、实践建议

  1. 测时请用 steady_clock

    • 避免系统时间调整的影响;high_resolution_clock 也可,但需确认其是否单调。
  2. 存储/序列化用 system_clock

    • 与现实世界时间对应,可转换为/自 time_t,与外部系统交互友好。
  3. 慎用 duration_cast 截断

    • 若需四舍五入,手动加半个单位再截断,或用浮点 duration<double> 做中介。
  4. 避免睡眠“过度”依赖精度

    • sleep_for 可能比请求时间更长;对高精度实时控制,应配合忙等或操作系统定时器 API。
  5. 利用 C++20 日历库

    • 对日期运算(加月、验证闰年等)请使用 year_month_day 等类型,胜过手写 tm 计算。
  6. 类型安全与可读性

    • 使用字面量(100ms, 2h)和 using namespace std::chrono_literals,代码简洁且避免单位混淆。

通过以上对 <chrono> 中时钟、duration、time_point、定时、格式化与实践建议的全面梳理,相信你能在性能测量、任务调度、日志时间戳与日历运算等场景中高效、正确地使用现代 C++ 时间库。祝编码顺利!

到此这篇关于C++ 标准库 <chrono>的具体使用的文章就介绍到这了,更多相关C++ <chrono>内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++自定义函数示例详解

    C++自定义函数示例详解

    在数学中,函数是一种基本的数学对象,它建立了一个集合(称为定义域)中的每个元素与另一个集合(称为值域)中的唯一元素之间的对应关系,这篇文章主要介绍了C++自定义函数示例详解,需要的朋友可以参考下
    2025-03-03
  • C++设计模式之适配器模式

    C++设计模式之适配器模式

    这篇文章主要介绍了C++设计模式之适配器模式,本文详细讲解了C++中的适配器模式,并给出了实现代码,需要的朋友可以参考下
    2014-09-09
  • QT网络编程UDP下C/S架构广播通信(实例讲解)

    QT网络编程UDP下C/S架构广播通信(实例讲解)

    下面小编就为大家带来一篇QT网络编程UDP下C/S架构广播通信(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Qt如何实现文本编辑器光标高亮技术

    Qt如何实现文本编辑器光标高亮技术

    这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-06-06
  • 详解C++中十六进制字符串转数字(数值)

    详解C++中十六进制字符串转数字(数值)

    这篇文章主要介绍了详解C++中十六进制字符串转数字(数值)的相关资料,这里提供两种实现方法,需要的朋友可以参考下
    2017-08-08
  • C++继承介绍

    C++继承介绍

    C++继承可以是单一继承或多重继承,每一个继承连接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • C++基本用法实践之智能指针详解

    C++基本用法实践之智能指针详解

    为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,下面小编就来和大家简单聊聊C++中智能指针的基本用法吧
    2023-07-07
  • 深入全排列算法及其实现方法

    深入全排列算法及其实现方法

    本篇文章是对全排列算法及其实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言学生成绩管理系统课程设计

    C语言学生成绩管理系统课程设计

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统课程设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++实现线程同步的四种方式总结

    C++实现线程同步的四种方式总结

    这篇文章主要为大家详细介绍了C++实现线程同步的四种方式,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论