Namespaces
Variants

std::chrono:: duration

From cppreference.net
定义于头文件 <chrono>
template <

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

> class duration ;
(C++11 起)

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

它由类型为 Rep 的滴答计数和一个滴答周期组成,其中滴答周期是一个编译期有理数 fraction ,表示相邻两次滴答之间的时间(以秒为单位)。

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

目录

成员类型

成员类型 定义
rep Rep ,一种算术类型或模拟算术类型的类,表示滴答计数
period Period (C++17 前) typename Period :: type (C++17 起) ,一个 std::ratio ,表示滴答周期(即每个滴答对应的秒分数)

成员函数

构造新的 duration
(公开成员函数)
赋值内容
(公开成员函数)
返回滴答计数
(公开成员函数)
[static]
返回特殊的 duration 值 zero
(公开静态成员函数)
[static]
返回特殊的 duration 值 min
(公开静态成员函数)
[static]
返回特殊的 duration 值 max
(公开静态成员函数)
实现一元 + 和一元 -
(公开成员函数)
递增或递减滴答计数
(公开成员函数)
实现两个 duration 之间的复合赋值
(公开成员函数)

非成员函数

实现以时长为参数的算术运算
(函数模板)
(C++11) (C++11) (removed in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
比较两个时长
(函数模板)
将时长转换为具有不同时间间隔单位的时长
(函数模板)
将时长转换为另一种时长,向下取整
(函数模板)
将时长转换为另一种时长,向上取整
(函数模板)
将时长转换为另一种时长,四舍五入到最接近的值,平局时取偶
(函数模板)
获取时长的绝对值
(函数模板)
(C++20)
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 >>

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

预定义的时长类型 days weeks months years 均覆盖至少 ±40000 年的时间范围。 years 等于 365.2425 个 days (格里历年的平均长度)。 months 等于 30.436875 个 days (即 years 的精确 1/12)。

(since C++20)

辅助类

特化 std::common_type 特性
(类模板特化)
指示时长可转换为具有不同滴答周期的时长类型
(类模板)
构造给定类型的滴答计数的零值、最小值和最大值
(类模板)
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::print std::println 实现。

字面量

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

注意:字面量后缀 d y 并非指代 days years ,而是分别对应 day year 类型。

(C++20 起)

注释

持续时间对象 d 所持有的实际时间间隔(以秒为单位)约等于 d. count ( ) * D :: period :: num / D :: period :: den ,其中 D chrono::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";
    // 整数比例转换且无精度损失:无需类型转换
    std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n"
              << std::chrono::microseconds(1s).count() << " microseconds\n"
              << std::chrono::nanoseconds(1s).count() << " nanoseconds\n";
    // 整数比例转换且有精度损失:需要显式转换
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << " minutes\n";
    // duration_cast的替代方案:
    std::cout << 1s / 1min << " minutes\n";
    // 浮点数比例转换:无需类型转换
    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