c++11 日期和时间工具(std::chrono::duration)(四)

定义于头文件 <chrono>

template< class Rep, class Period = std::ratio<1> > class duration;

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

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

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

比较两个时长

operator==,!=,<,<=,>,>=(std::chrono::duration)
template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator==(const duration<Rep1, Period1>& lhs,

                          const duration<Rep2, Period2>& rhs);
(1)
template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator!=(const duration<Rep1, Period1>& lhs,

                          const duration<Rep2, Period2>& rhs);
(2)
template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator<(const duration<Rep1, Period1>& lhs,

                         const duration<Rep2, Period2>& rhs);
(3)
template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator<=(const duration<Rep1, Period1>& lhs,

                          const duration<Rep2, Period2>& rhs);
(4)
template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator>(const duration<Rep1, Period1>& lhs,

                         const duration<Rep2, Period2>& rhs);
(5)
template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator>=(const duration<Rep1, Period1>& lhs,

                          const duration<Rep2, Period2>& rhs);
(6)

比较二个时长。

1-2) 检查 lhsrhs 是否相等,即以两个 duration 的共用类型表示的计次数是否相等。

3-6) 比较 lhsrhs ,即比较两个 duration 的共用类型表示的计次数。

参数

lhs-运算符左侧的 duration
rhs-运算符右侧的 duration

返回值

假设 CT =
std::common_type<std::chrono::duration<Rep1, Period1>,
                 std::chrono::duration<Rep2, Period2>>::type ,则为:

1) CT(lhs).count() == CT(rhs).count()

2) !(lhs == rhs)

3) CT(lhs).count() < CT(rhs).count()

4) !(rhs < lhs)

5) rhs < lhs

6) !(lhs < rhs)

 调用示例

#include <chrono>
#include <iostream>
int main()
{
    if (std::chrono::seconds(2) == std::chrono::milliseconds(2000))
    {
        std::cout <<  "2 s == 2000 ms\n";
    }
    else
    {
        std::cout <<  "2 s != 2000 ms\n";
    }

    if (std::chrono::seconds(61) > std::chrono::minutes(1))
    {
        std::cout <<  "61 s > 1 min\n";
    }
    else
    {
        std::cout <<  "61 s <= 1 min\n";
    }
}


转换时长到另一个拥有不同嘀嗒间隔的时长

std::chrono::duration_cast

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep,Period>& d);

(C++11 起)

转换 std::chrono::duration 为不同类型 ToDuration 的时长。

不使用隐式转换。可能的情况下避免乘法和除法,若在编译时已知一或多个参数为 1 。以最宽的可用类型进行计算,而如同用 static_cast 到结果类型的转换,只在完成时进行。

参数

d-要转换的 duration

返回值

转换为 ToDuration 类型时长的 d

注意

函数不参与重载决议,除非 ToDuration 是 std::chrono::duration 的实例。

在源周期能准确地为目标周期所整除的场合(例如小时到分钟),浮点时长和整数时长间转型能隐式进行,无需 duration_cast 。

从浮点时长转型到整数时长,在浮点值为 NaN 、无穷大或过大而无法以目标的整数类型表示时,导致未定义行为。

 调用示例

#include <iostream>
#include <chrono>
#include <ratio>
#include <thread>

void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    f();
    auto t2 = std::chrono::high_resolution_clock::now();

    // 整数时长:要求 duration_cast
    auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);

    // 小数时长:不要求 duration_cast
    std::chrono::duration<double, std::milli> fp_ms = t2 - t1;

    std::cout << "f() took " << fp_ms.count() << " ms, "
              << "or " << int_ms.count() << " whole milliseconds\n";
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值