命名空间
变体
操作

std::chrono::duration

来自 cppreference.cn
< cpp‎ | chrono
 
 
 
 
定义于头文件 <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 表示刻度周期(即每刻度的秒分数)

[编辑] 成员函数

构造新的 duration
(public 成员函数) [编辑]
赋值内容
(public 成员函数) [编辑]
返回刻度计数
(public 成员函数) [编辑]
[静态]
返回特殊的 duration 值 zero
(public static 成员函数) [编辑]
[静态]
返回特殊的 duration 值 min
(public static 成员函数) [编辑]
[静态]
返回特殊的 duration 值 max
(public static 成员函数) [编辑]
实现一元 + 和一元 -
(public 成员函数) [编辑]
增加或减少刻度计数
(public 成员函数) [编辑]
实现两个 duration 之间的复合赋值
(public 成员函数) [编辑]

[编辑] 非成员函数

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

[编辑] 辅助类型

下表中的类型 /* 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>>

注意:每个预定义的 duration 类型,直到 hours,至少覆盖 ±292 年的范围。

预定义的 duration 类型 daysweeksmonthsyears,每个都至少覆盖 ±40000 年的范围。years 等于 365.2425 days(公历年的平均长度)。months 等于 30.436875 days(恰好是 years 的 1/12)。

(C++20 起)

[编辑] 辅助类

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

[编辑] 辅助特化

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

[编辑] 字面量

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

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

(C++20 起)

[编辑] 注释

由 duration 对象 d 持有的实际时间间隔(以秒为单位)大致等于 d.count() * D::period::num / D::period::den,其中 D 是类型 chrono::duration<>,而 d 是此类类型的一个对象。

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

[编辑] 示例

此示例展示了如何定义几个自定义 duration 类型并在类型之间进行转换

#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";
    // alternative to duration_cast:
    std::cout << 1s / 1min << " 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 minutes
0.82672 microfortnights
0.316887 nanocenturies
24 frames at 24fps