std::chrono::duration

来自cppreference.com
< cpp‎ | chrono
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(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)
 
日期和时间工具
时间点
(C++11)
(C++20)
时长
duration
(C++11)
时钟
(C++11)      
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
当天时刻
(C++20)(C++20)
(C++20)(C++20)
(C++20)

日历
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)(C++20)
时区
(C++20)
(C++20)
(C++20)
chrono I/O
(C++20)
C 风格日期和时间
 
 
在标头 <chrono> 定义
template<

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

> class duration;
(C++11 起)

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

它由 Rep 类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。

duration 存储的数据只有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。

成员类型

成员类型 定义
rep Rep,表示计次数的算术类型
period Period (C++17 前)typename Period::type (C++17 起),表示计次周期的 std::ratio(即每次的秒数)

成员函数

构造新 duration
(公开成员函数)
赋值内容
(公开成员函数)
返回计次的计数
(公开成员函数)
[静态]
返回特殊时长值零
(公开静态成员函数)
[静态]
返回特殊时长值最小值
(公开静态成员函数)
[静态]
返回特殊时长值最大值
(公开静态成员函数)
实现一元 + 和一元 -
(公开成员函数)
递增或递减滴答计数
(公开成员函数)
实现二个时长间的复合赋值
(公开成员函数)

非成员函数

实现以时长为实参的算术运算
(函数模板)
(C++11)(C++11)(C++20 中移除)(C++11)(C++11)(C++11)(C++11)(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 年的范围。

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

(C++20 起)

辅助类

特化 std::common_type 特征
(类模板特化)
指示时长可转换为拥有不同计次的时长
(类模板)
构造给定类型计次的零、最小及最大值
(类模板)
duration 的格式化支持
(类模板特化)
std::chrono::duration 的散列支持
(类模板特化)

字面量

在内联命名空间 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 起)

注解

时长对象 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秒是:\n";
 
    // 无精度损失的整数尺度转换:无转型
    std::cout << std::chrono::milliseconds(1s).count() << "毫秒\n"
              << std::chrono::microseconds(1s).count() << "微秒\n"
              << std::chrono::nanoseconds(1s).count()  << "纳秒\n";
 
    // 有精度损失的整数尺度转换:需要转型
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << "分\n";
 
    // 浮点尺度转换:无转型
    std::cout << microfortnights(1s).count() << "微两周\n"
              << nanocenturies(1s).count() << "纳世纪\n"
              << "24fps下的" << fps_24(1s).count() << "帧\n";
}

输出:

1秒是:
1000毫秒
1000000微秒
1000000000纳秒
0分
0.82672微两周
0.316887纳世纪
24fps下的24帧