定义于头文件 <chrono>

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

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

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

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

特化 std::common_type 特征

std::common_type(std::chrono::duration)
template <class Rep1, class Period1, class Rep2, class Period2>
struct common_type<std::chrono::duration<Rep1, Period1>,
std::chrono::duration<Rep2, Period2>> {
typedef std::chrono::duration<
typename std::common_type<Rep1, Rep2>::type, /*see note*/> type;};

暴露名为 type 的类型,它是二个 std::chrono::duration 的共用类型。

注意

结果 duration 的周期是 Period1Period2 的最大公约数。

调用示例

#include <iostream>
#include <chrono>// std::chrono 已找到最大公约数,类似使用 std::common_type<> 。
// 我们令类型推导外化。template <typename T, typename S>
auto durationDiff(const T& t, const S& s)  -> typename std::common_type<T, S>::type
{typedef typename std::common_type<T, S>::type Common;return Common(t) - Common(s);
}int main()
{typedef std::chrono::milliseconds milliseconds;typedef std::chrono::microseconds microseconds;auto ms = milliseconds(30);auto us = microseconds(1100);std::cout << ms.count() << "ms - " << us.count() << "us = "<< durationDiff(ms, us).count() <<  "\n";
}

实现以时长为实参的算术运算

operator+,-,*,/,%(std::chrono::duration)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator+( const duration<Rep1,Period1>& lhs,

const duration<Rep2,Period2>& rhs );

(1)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator-( const duration<Rep1,Period1>& lhs,

const duration<Rep2,Period2>& rhs );

(2)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator*( const duration<Rep1,Period>& d,

const Rep2& s );

(3)
template< class Rep1, class Rep2, class Period >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator*( const Rep1& s,

const duration<Rep2,Period>& d );

(4)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator/( const duration<Rep1,Period>& d,

const Rep2& s );

(5)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<Rep1,Rep2>::type
    constexpr operator/( const duration<Rep1,Period1>& lhs,

const duration<Rep2,Period2>& rhs );

(6)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator%( const duration<Rep1, Period>& d,

const Rep2& s );

(7)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
constexpr operator%( const duration<Rep1,Period1>& lhs,

const duration<Rep2,Period2>& rhs );

(8)

在二个 duration 或 duration 和计次数之间进行基本算术运算。

1) 转换二个 duration 为其共用类型,并创建计次数为转换后计次数之和的 duration 。

2) 转换二个 duration 为其共用类型,并创建计次数为转换后从 lhs 的计次数减去 rhs 的计次数的 duration 。

3-4) 转换 duration d 到其 repRep1Rep2 之间的共用类型的 duration ,并将转换后的计次数乘 s

5) 转换 duration d 到其 repRep1Rep2 之间的共用类型的 duration ,并将转换后的计次数除以 s

6) 转换二个 duration 为其共用类型,并将 lhs 转换后的计次数除以 rhs 转换后的计次数。注意此运算符的返回值不是 duration 。

7) 转换转换 duration d 到其 repRep1Rep2 之间的共用类型的 duration ,并创建计次数为此时长的计次数除以 s 的 duration 。

8) 转换二个 duration 为其共用类型,并创建计次数为转换后计次数取余的 duration 。

本节未完成
原因:列出“不参与重载决议,除非”的制约

参数

lhs - 运算符左侧的 duration
rhs - 运算符右侧的 duration
d - 混合参数运算符的时长参数
s - 混合参数运算符的计次参数

返回值

假设 CD 为函数返回类型且 CR<A, B> = std::common_type<A, B>::type ,则:

1) CD(CD(lhs).count() + CD(rhs).count())

2) CD(CD(lhs).count() - CD(rhs).count())

3-4) CD(CD(d).count() * s)

5) CD(CD(d).count() / s).

6) CD(lhs).count() / CD(rhs).count() (此运算符的返回类型非 duration )

7) CD(CD(d).count() % s)

8) CD(CD(lhs).count() % CD(rhs).count())

调用示例

#include <chrono>
#include <iostream>
int main()
{// 简单算术std::chrono::seconds s = std::chrono::hours(1)+ 2 * std::chrono::minutes(10)+ std::chrono::seconds(70) / 10;std::cout << "1 hour + 2*10 min + 70/10 sec = " << s.count() << " seconds\n";// 时长除以一个数和时长除以另一时长的区别std::cout << "Dividing that by 2 minutes gives "<< s / std::chrono::minutes(2) << '\n';std::cout << "Dividing that by 2 gives "<< (s / 2).count() << " seconds\n";// 余数运算符在确定此特定时长在时间框架的场合有用,// 例如,拆分它为时、分和秒:std::cout << s.count() << " seconds is "<< std::chrono::duration_cast<std::chrono::hours>(s).count() << " hours, "<< std::chrono::duration_cast<std::chrono::minutes>(s % std::chrono::hours(1)).count() << " minutes, "<< std::chrono::duration_cast<std::chrono::seconds>(s % std::chrono::minutes(1)).count() << " seconds\n";
}

输出

c++11 日期和时间工具(std::chrono::duration)(三)相关推荐

  1. c++11日期和时间工具-(std::chrono::system_clock)

    定义于头文件 <chrono> std::chrono 库 chrono 库定义三种主要类型以及工具函数和常用 typedef . 时钟 时长 时间点 来自系统范畴实时时钟的挂钟时间 st ...

  2. C++11中的时间库std::chrono(引发关于时间的思考)

    文章目录 前言 chrono 的概况 chrono 的核心内容 duration clock system_clock steady_clock time point 关于时间的思考 时间函数思考 总 ...

  3. c++11日期和时间库:chrono

    std::chrono 主要包含两部分,std::chrono::duration 和 std::chrono::time_point,它们都是类模板,std::chrono::duration 表示 ...

  4. (笔记)处理日期和时间的方法(chrono 库,time_t等)

    文章目录 0 摘要 1 chrono 库 1.1 时间间隔duration 1.2 时间点time point 1.3 时钟clocks 1.3.1 system_clock 1.3.2 steady ...

  5. Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,

    Java8 ,LocalDate,LocalDateTime处理日期和时间工具类 日期格式化 1.获取今天的日期 2.在Java 8 中获取年.月.日信息 3.在Java 8 中处理特定日期 4.在J ...

  6. C++11新特性,利用std::chrono精简传统获取系统时间的方法

    一.传统的获取系统时间的方法 传统的C++获取时间的方法须要分平台来定义. 相信百度代码也不少. 我自己写了下,例如以下. const std::string getCurrentSystemTime ...

  7. C++11 新的计时方法——std::chrono 大法好

    计时有很多用途,比如:测试某一段代码的运行时间,时间越短,则性能相对越高.计时有很多方法,我将首先给出我以前常用的一种计时方法,然后给出我认为的最佳方法(采用了C++11的标准技术). 首先给出我以前 ...

  8. C++处理日期和时间的chrono库

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

  9. C++ 使用 chrono 库处理日期和时间

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

  10. c++11:std::chrono::time_point、time_t、std::localtime、std::gmtime、std::chrono::steady_clock

    template<class Clock,class Duration = typename Clock::duration> class time_point; 类模板 std::chr ...

最新文章

  1. Java从零开始学四十六(Junit)
  2. 游标式屏幕菜单c语言,【C语言】控制台窗口图形界面编程(六):光标设置
  3. 版本控制集中式与分布式的区别
  4. MySQL为表的指定字段添加数据
  5. Dynamic Web TWAIN扫描识别工具改变缓冲区图像大小
  6. 有哪些足不出户,能用十天掌握的新技能?
  7. 腾讯成联合国全球合作伙伴,TDSQL如何支撑史上最大规模全球会议
  8. 阮一峰react demo代码研究的学习笔记 - how is h1 got parsed - not answer
  9. knn k的选取_经典算法(四):KNN
  10. jQuery mobile button 禁用和启用
  11. java 线程 原子性_深入理解Java多线程与并发框架——Java内存模型与原子性、可见性、有序性...
  12. 12.06课堂笔记以及作业
  13. 潘多拉固件设置ipv6_Phicomm-k2+pandorabox固件+PPPOE拨号+IPV6
  14. (tensorflow2.1.0安装教程) 对应Anaconda3(对应python3.7)+cuda10.1+cudnn7.6.5+Pycharm 网盘 链接
  15. 心海软件学心理测试系统,心海软件-心理测试、心理档案、心理咨询室管理系统...
  16. Java编写MD5加密工具类,登录密码加密
  17. 上网软件 Chrome/FireFox插件-gooreplacer
  18. linux gpt分区挂载,GPT分区和挂载
  19. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
  20. 面试分享:专科半年经验面试阿里前端P6+总结

热门文章

  1. html如何插入一张图片,html如何插入图片
  2. Eat,PrayLove--结婚3周年
  3. Processing绘制随风飘扬的名画
  4. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
  5. Ipad项目中用到的UIModalPresentationFormSheet,点击阴影部分dismiss 当前presented的controller
  6. 判断table中的tbody是否有数据
  7. 【5G核心网】5GC核心网之网元NSSF
  8. 【绝对原创】EFS加密文件真的可以解密!各位不要放弃哈~
  9. 智慧社区中的物联网产品应用
  10. Establishing SSL