命名空间
变体
操作

std::chrono::duration

来自 cppreference.cn
< cpp‎ | chrono
 
 
 
 
定义于头文件 <chrono>
template<

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

> class duration;
(since C++11)

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

它由类型为 Rep 的节拍计数和节拍周期组成,其中节拍周期是一个编译时有理数 分数,表示从一个节拍到下一个节拍的时间,以秒为单位。

存储在 duration 中的唯一数据是类型为 Rep 的节拍计数。如果 Rep 是浮点数,则 duration 可以表示节拍的分数。Period 作为 duration 类型的一部分包含在内,仅在不同 duration 之间转换时使用。

内容

[编辑] 成员类型

成员类型 定义
rep Rep,一种算术类型,或一个模拟算术类型的类,表示节拍数
period Period(until C++17)typename Period::type(since C++17),一个 std::ratio,表示节拍周期(即每节拍的秒数分数)

[编辑] 成员函数

构造新的 duration
(public member function) [编辑]
赋值内容
(public member function) [编辑]
返回节拍数
(public member function) [编辑]
[静态]
返回特殊的 duration 值 zero
(public static member function) [编辑]
[静态]
返回特殊的 duration 值 min
(public static member function) [编辑]
[静态]
返回特殊的 duration 值 max
(public static member function) [编辑]
实现一元 + 和一元 -
(public member function) [编辑]
递增或递减节拍计数
(public member function) [编辑]
实现两个 duration 之间的复合赋值
(public member function) [编辑]

[编辑] 非成员函数

使用 duration 作为参数实现算术运算
(function template) [编辑]
(C++11)(C++11)(removed in C++20)(C++11)(C++11)(C++11)(C++11)(C++20)
比较两个 duration
(function template) [编辑]
将一个 duration 转换为另一个,具有不同的节拍间隔。
(function template) [编辑]
将一个 duration 转换为另一个,向下取整
(function template) [编辑]
将一个 duration 转换为另一个,向上取整
(function template) [编辑]
将一个 duration 转换为另一个,四舍五入到最近的, ties to even
(function template) [编辑]
获取 duration 的绝对值
(function template) [编辑]
对 duration 执行流输出
(function template) [编辑]
根据提供的格式从流中解析 duration
(function template) [编辑]

[编辑] 辅助类型

下表中使用类型 /* 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 (since C++20) std::chrono::duration</* int25 */, std::ratio<86400>>
std::chrono::weeks (since C++20) std::chrono::duration</* int22 */, std::ratio<604800>>
std::chrono::months (since C++20) std::chrono::duration</* int20 */, std::ratio<2629746>>
std::chrono::years (since C++20) std::chrono::duration</* int17 */, std::ratio<31556952>>

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

每个预定义的 duration 类型 days、weeks、months 和 years 都覆盖至少 ±40000 年的范围。years 等于 365.2425 天(格里高利年的平均长度)。months 等于 30.436875 天(正好是 years 的 1/12)。

(since C++20)

[编辑] 辅助类

特化 std::common_type 特性
(class template specialization) [编辑]
表示 duration 可以转换为具有不同节拍周期的 duration。
(class template) [编辑]
构造给定类型的节拍数的 zero、min 和 max 值。
(class template) [编辑]
duration 的格式化支持
(class template specialization) [编辑]
std::chrono::duration 的哈希支持
(class template specialization)

[编辑] 辅助特化

template< class Rep, class Period >

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

    = enable_nonlocking_formatter_optimization<Rep>;
(since C++23)

std::enable_nonlocking_formatter_optimization 的此特化使得能够高效地实现 std::printstd::println,以便在模板参数 Rep 启用时打印 chrono::duration 对象。

[编辑] 字面量

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

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

(since C++20)

[编辑] 注释

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

特性测试 Std 特性
__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