处理日期和时间的chrono库

C++11中提供了日期和时间相关的库chrono,通过chrono库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point

1. 时间间隔duration

1.1 常用类成员

duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下:

// 定义于头文件 <chrono>
template<
    class Rep,
    class Period = std::ratio<1>
> class duration;
  • Rep:这是一个数值类型,表示时钟数(周期)的类型(默认为整形)。若 Rep 是浮点数,则 duration 能使用小数描述时钟周期的数目。
  • Period:表示时钟的周期,它的原型如下:
// 定义于头文件 <ratio>
template<
    std::intmax_t Num,
    std::intmax_t Denom = 1
> class ratio;

ratio类表示每个时钟周期的秒数,其中第一个模板参数Num代表分子Denom代表分母,该分母值默认为1,因此,ratio代表的是一个分子除以分母的数值,比如:ratio<2>代表一个时钟周期是2秒,ratio<60>代表一分钟,ratio<6060>代表一个小时,ratio<6060*24>代表一天。而ratio<1,1000>代表的是1/1000秒,也就是1毫秒,ratio<1,1000000>代表一微秒,ratio<1,1000000000>代表一纳秒。

为了方便使用,在标准库中定义了一些常用的时间间隔,比如:时、分、秒、毫秒、微秒、纳秒,它们都位于chrono命名空间下,定义如下:

类型 定义
纳秒:std::chrono::nanoseconds duration<Rep*/至少 64 位的有符号整数类型/*, std::nano>
微秒:std::chrono::microseconds duration<Rep*/至少 55 位的有符号整数类型/*, std::micro>
毫秒:std::chrono::milliseconds duration<Rep*/至少 45 位的有符号整数类型/*, std::milli>
秒: std::chrono::seconds duration<Rep*/至少 35 位的有符号整数类型/*>
分钟:std::chrono::minutes duration<Rep*/至少 29 位的有符号整数类型/*, std::ratio<60>>
小时:std::chrono::hours duration<Rep*/至少 23 位的有符号整数类型/*, std::ratio<3600>>

注意:到 hours 为止的每个预定义时长类型至少涵盖 ±292 年的范围。

duration类的构造函数原型如下:

// 1. 拷贝构造函数
duration( const duration& ) = default;
// 2. 通过指定时钟周期的类型来构造对象
template< class Rep2 >
constexpr explicit duration( const Rep2& r );
// 3. 通过指定时钟周期类型,和时钟周期长度来构造对象
template< class Rep2, class Period2 >
constexpr duration( const duration<Rep2,Period2>& d );

为了更加方便的进行duration对象之间的操作,类内部进行了操作符重载:

操作符重载 描述
operator= 赋值内容 (公开成员函数)
operator+ operator- 实现一元 + 和一元 - (公开成员函数)
operator++ operator++(int) operator– operator–(int) 递增或递减周期计数 (公开成员函数)
operator+= operator-= operator*= operator/= operator%= 实现二个时长间的复合赋值 (公开成员函数)

duration类还提供了获取时间间隔的时钟周期数的方法count(),函数原型如下:

constexpr rep count() const;

1.2 类的使用

通过构造函数构造事件间隔对象示例代码如下:

#include <chrono>
#include <iostream>
using namespace std;
int main()
{
    chrono::hours h(1);                          // 一小时
    chrono::milliseconds ms{ 3 };                // 3 毫秒
    chrono::duration<int, ratio<1000>> ks(3);    // 3000 秒

    // chrono::duration<int, ratio<1000>> d3(3.5);  // error
    chrono::duration<double> dd(6.6);               // 6.6 秒

    // 使用小数表示时钟周期的次数
    chrono::duration<double, std::ratio<1, 30>> hz(3.5);
}
  • h(1)时钟周期为1小时,共有1个时钟周期,所以h表示的时间间隔为1小时
  • ms(3)时钟周期为1毫秒,共有3个时钟周期,所以ms表示的时间间隔为3毫秒
  • ks(3)时钟周期为1000秒,一共有三个时钟周期,所以ks表示的时间间隔为3000秒
  • d3(3.5)时钟周期为1000秒,时钟周期数量只能用整形来表示,但是此处指定的是浮点数,因此语法错误
  • dd(6.6)时钟周期为默认的1秒,共有6.6个时钟周期,所以dd表示的时间间隔为6.6秒
  • hz(3.5)时钟周期为1/30秒,共有3.5个时钟周期,所以hz表示的时间间隔为1/30*3.5秒

chrono库中根据duration类封装了不同长度的时钟周期(也可以自定义),基于这个时钟周期再进行周期次数的设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从入门到捕蛇者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值