std::chrono::duration和std::chrono::time_point

目录

一、std::chrono::duration:表示时间间隔(时长)

1. 核心定义

2. 标准预定义的 duration 类型

3. 常用操作

4. 应用场景

二、std::chrono::time_point:表示时间点

1. 核心定义

2. 常用操作

3. 应用场景

三、duration 与 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:存储时间间隔的数值类型(如 intlong 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_clocksystem_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 等类型的精度不足和单位混乱问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值