命名空间
变体
操作

std::chrono::duration

来自 cppreference.com
< cpp‎ | chrono
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
 
定义在头文件 <chrono>
template<

    class Rep,
    class Period = std::ratio<1>

> class duration;
(自 C++11 起)

类模板 std::chrono::duration 代表一个时间间隔。

它包含一个类型为 Rep 的刻度计数和一个刻度周期,其中刻度周期是一个编译时有理数 分数,代表从一个刻度到下一个刻度的时间(以秒为单位)。

duration 中存储的唯一数据是一个类型为 Rep 的刻度计数。如果 Rep 是浮点数,则 duration 可以代表刻度的分数。Period 被包含为 duration 类型的一部分,并且仅在不同 duration 之间进行转换时使用。

内容

[编辑] 成员类型

成员类型 定义
rep Rep,一个算术类型,或一个模拟算术类型的类,代表刻度数量
period Period(直到 C++17)typename Period::type(自 C++17 起), 一个 std::ratio,代表刻度周期(即每个刻度的秒分数)

[编辑] 成员函数

构造新的持续时间
(公共成员函数) [编辑]
分配内容
(公共成员函数) [编辑]
返回刻度计数
(公共成员函数) [编辑]
[静态]
返回特殊的持续时间值零
(公共静态成员函数) [编辑]
[静态]
返回特殊的持续时间值 min
(公共静态成员函数) [编辑]
[静态]
返回特殊的持续时间值 max
(公共静态成员函数) [编辑]
实现一元 + 和一元 -
(公共成员函数) [编辑]
增加或减少滴答计数
(公共成员函数) [edit]
实现两个持续时间之间的复合赋值
(公共成员函数) [edit]

[edit] 非成员函数

实现以持续时间作为参数的算术运算
(函数模板) [edit]
(C++11)(C++11)(C++20 中移除)(C++11)(C++11)(C++11)(C++11)(C++20)
比较两个持续时间
(函数模板) [edit]
将持续时间转换为另一个持续时间,具有不同的滴答间隔
(函数模板) [edit]
将持续时间转换为另一个持续时间,向下舍入
(函数模板) [edit]
将持续时间转换为另一个持续时间,向上舍入
(函数模板) [edit]
将持续时间转换为另一个持续时间,舍入到最接近的值,将平局舍入到偶数
(函数模板) [edit]
获取持续时间的绝对值
(函数模板) [edit]
duration 执行流输出
(函数模板) [edit]
根据提供的格式从流中解析 duration
(函数模板) [edit]

[edit] 辅助类型

类型 /* intXX */ 在下面的表格中表示至少 XX 位的带符号整数类型。

类型 定义
std::chrono::nanoseconds std::chrono::duration</* int64 */, std::nano>
std::chrono::microseconds std::chrono::duration</* int55 */, std::micro>
std::chrono::milliseconds std::chrono::duration</* int45 */, std::milli>
std::chrono::seconds std::chrono::duration</* int35 */>
std::chrono::minutes std::chrono::duration</* int29 */, std::ratio<60>>
std::chrono::hours std::chrono::duration</* int23 */, std::ratio<3600>>
std::chrono::days (自 C++20 起) std::chrono::duration</* int25 */, std::ratio<86400>>
std::chrono::weeks (自 C++20 起) std::chrono::duration</* int22 */, std::ratio<604800>>
std::chrono::months (自 C++20 起) std::chrono::duration</* int20 */, std::ratio<2629746>>
std::chrono::years (自 C++20 起) std::chrono::duration</* int17 */, std::ratio<31556952>>

注意:每个预定义的持续时间类型(直到 hours)涵盖的范围至少为 ±292 年。

每个预定义的持续时间类型 daysweeksmonthsyears 涵盖的范围至少为 ±40000 年。years 等于 365.2425 days(格里高利历年的平均长度)。months 等于 30.436875 days(恰好是 years 的 1/12)。

(自 C++20 起)

[edit] 辅助类

专门化 std::common_type 特性
(类模板专门化) [edit]
指示持续时间可以转换为具有不同滴答周期的持续时间
(类模板) [edit]
构造给定类型的滴答计数的零、最小值和最大值
(类模板) [edit]
duration 的格式化支持
(类模板专门化) [edit]
std::chrono::duration 的哈希支持
(类模板专门化)

[edit] 辅助专门化

template< class Rep, class Period >

constexpr bool enable_nonlocking_formatter_optimization<chrono::duration<Rep, Period>>

 = enable_nonlocking_formatter_optimization<Rep>;
(自 C++23 起)

std::enable_nonlocking_formatter_optimization 的专门化在模板参数 Rep 启用时,为打印 chrono::duration 对象有效地实现 std::printstd::println 提供了支持。

[edit] 字面量

在内联命名空间 std::literals::chrono_literals 中定义
一个表示小时的 std::chrono::duration 字面量
(函数) [edit]
一个表示分钟的 std::chrono::duration 字面量
(函数) [edit]
一个表示秒的 std::chrono::duration 字面量
(函数) [edit]
一个表示毫秒的 std::chrono::duration 字面量
(函数) [edit]
一个表示微秒的 std::chrono::duration 字面量
(函数) [edit]
一个表示纳秒的 std::chrono::duration 字面量
(函数) [edit]

注意:字面量后缀 dy 不表示 daysyears,而是表示 dayyear

(自 C++20 起)

[edit] 注释

持续时间对象d 所持有的实际时间间隔(以秒为单位)大约等于 d.count() * D::period::num / D::period::den,其中 Dchrono::duration<> 类型,d 是这种类型的对象。

特性测试 标准 特性
__cpp_lib_chrono_udls 201304L (C++14) 时间类型的用户定义字面量

[编辑] 示例

此示例展示了如何定义几种自定义持续时间类型以及如何在类型之间进行转换。

#include <chrono>
#include <iostream>
 
using namespace std::chrono_literals;
 
template<typename T1, typename T2>
using mul = std::ratio_multiply<T1, T2>;
 
int main()
{
    using microfortnights = std::chrono::duration<float,
        mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>;
    using nanocenturies = std::chrono::duration<float,
        mul<mul<std::hecto, std::chrono::years::period>, std::nano>>;
    using fps_24 = std::chrono::duration<double, std::ratio<1, 24>>;
 
    std::cout << "1 second is:\n";
 
    // integer scale conversion with no precision loss: no cast
    std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n"
              << std::chrono::microseconds(1s).count() << " microseconds\n"
              << std::chrono::nanoseconds(1s).count() << " nanoseconds\n";
 
    // integer scale conversion with precision loss: requires a cast
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << " minutes\n";
 
    // floating-point scale conversion: no cast
    std::cout << microfortnights(1s).count() << " microfortnights\n"
              << nanocenturies(1s).count() << " nanocenturies\n"
              << fps_24(1s).count() << " frames at 24fps\n";
}

输出

1 second is:
1000 milliseconds
1000000 microseconds
1000000000 nanoseconds
0 minutes
0.82672 microfortnights
0.316887 nanocenturies
24 frames at 24fps