C++11时间日期库chrono的使用

目录
  • 时钟与时间点
    • clock
    • 时间显示
    • 运行计时
  • 时间间隔duration
    • duration模板
    • duration_cast
    • ratio

chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,主要包含了:duration, time_point, clock。

时钟与时间点

chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应类型的时间点。

clock

时钟是从一个时点开始,按照某个刻度的计数;chrono同时提供了三种时钟(通过now()获取当前时间点):

  • system_clock:系统时钟,相对epoch(1970-01-01 00:00:00UTC)的时间间隔;
  • steady_clock:单调时钟,只能增长(后一次调用now()得到的时间总是比前一次的值大);一般是相对于系统启动时间的时间间隔;
  • high_resolution_clock:高精度时钟(当前系统能提供的最高精度时钟,很可能就是steady_clock),也是单调的;

需要得到绝对时点的场景使用system_clock;需要得到时间间隔,且不受系统时间修改而受影响时使用steady_clock。

时间显示

在C++20中直接有to_stream直接输出system_clock时钟;但在此之前,只能通过间接的方式来输出:

auto tNow = system_clock::now();
auto tmNow = system_clock::to_time_t(tNow);
auto locNow = std::localtime(&tmNow);
cout<<std::put_time(locNow, "%Y-%m-%d %H:%M:%S")<<endl; // 2019-12-20 19:35:12

system_clock::from_time_t(...)可以把time_t类型时间转换为time_point,便于chrono使用。

运行计时

通过steady_clock/high_resolution_clock可方便的进行计时:

public:
  explicit XRunTime{bool bStart){
    if(bStart) Restart();
  }

  void Restart(){
    m_tpStart = high_resolution_clock::now();
  }

  double Stop(){
    return operator()();
  }
  double operator()(void){
    auto tpEnd = high_resolution_clock::now();
    auto elap = tpEnd - m_tpStart;
    return (double)elap.count() / std::nano::den; //返回运行的秒数,如1.00345
  }
}

时间间隔duration

chrono中使用duration模板类来表示时间间隔,并定义了从小时到纳秒的时间间隔。

duration模板

duration使用一个数值(表示时钟数)和分数(ratio)来表示具体间隔。支持基本的算术运算,并通过count()获取具体的时钟数。

template<typename _Rep, typename _Period = ratio<1>>
struct duration
{
  typedef _Rep   rep;

  constexpr _Rep count() const{
    return (_MyRep);
  }
  ...
private:
  _Rep  _MyRep;  //时钟计数
};

基准是秒,并依次定义了常用的间隔,如:

typedef duration<long long> seconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long, ratio<3600>> hours;

不同的时间间隔可以直接进行算术运算,如休眠需要毫秒参数,我们可以封装接收秒与毫秒的接口:

void MySleep(int nSec, int nMillSec){
  std::chrono::seconds secs(nSec);
  std::chrono::milliseconds mills(nMillSec);
  std::this_thread::sleep_for(secs+mills);
}

duration_cast

使用duration_cast可以方便的在不同时间单位间进行转换,如:

auto sec=seconds(123);
auto minu=duration_cast<minutes>(sec);
cout<<sec.count()<<","<<minu.count()<<endl; // 123,2

ratio

ratio是一个分数模板类,第一个参数为分子,第二个参数为分母;通过静态成员可获取:

  • num:分子
  • den:分母
typedef ratio<1, 1000> milli;
typedef ratio<1000, 1> kilo;
cout<<milli::den<<endl; // 1000

到此这篇关于C++11时间日期库chrono的使用的文章就介绍到这了,更多相关C++11时间日期库chrono 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++使用chrono库处理日期和时间的实现方法

    目录 1. 时间间隔 duration 1.1 常用类成员 1.2 类的使用 2. 时间点 time point 3. 时钟 clocks 3.1 system_clock 3.2 steady_clock 3.3 high_resolution_clock 4. 转换函数 4.1 duration_cast 4.2 time_point_cast C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利.chrono 库主要

  • C++时间戳转换成日期时间的步骤和示例代码

    因工作需要,经常跟时间戳打交道,但是因为它仅仅是一个数字,我们很难直接看出它有什么意义,或两个时间戳之间究竟差了多长的间隔.于是从MSDN for Visual Studio6上找到了时间戳转换成日期时间的算法.本文除介绍这一算法外,还提供一个示例代码. 1.将时间戳转换成一串32比特的二进制数.有些数字转换之后不够32位,则在前面补充0.这可通过windows自带的计算器完成.比如481522543转换成 0001 1100 1011 0011 0111 0011 0110 1111 2.根据

  • C++ boost 时间与日期处理详细介绍

    boost 时间与日期处理 导视: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确,可派生个类,调用stream的precision设置 progress_display 图形化显示进度 只能输出到cout 如果还有其他输出则会干扰进度显示. 折中的办法是重新显示 pd.restart(size); pd+= pNum; date 日期结构,时间点 -- da

  • C++11时间日期库chrono的使用

    目录 时钟与时间点 clock 时间显示 运行计时 时间间隔duration duration模板 duration_cast ratio chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,主要包含了:duration, time_point, clock. 时钟与时间点 chrono中用time_point模板类表示时间点,其支持基本算术操作:不同时钟clock分别返回其对应类型的时间点. clock 时钟是从一个时点开始,按照某个刻度的计数:chrono同时提供了

  • Java8新特性时间日期库DateTime API及示例详解

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API来处理日期相关操作,这篇文章你一定不要错过.来刷新你的知识库吧! 背景 Java对日期.日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差,不支持时区,非线程安全:还有用于格式化日期的类DateFormat也是非线程安全的等问题. J

  • Java 8新的时间日期库的20个使用示例

    原文:http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.html 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API.Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDa

  • Java8时间日期库中的常用使用示例

    有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之,只有任务本身才会真正促使你去探索及学习.java 8的新的日期及时间API也是一样.为了学习Java 8的这个新库,这里我创建了20个以任务为导向的例子.我们先从一个简单的任务开始,比如说如何用Java 8的时间日期库来表示今天,接着再进一步生成一个带时间及时区的完整日期,然后再研究下如何完成一些更实际的任务,比如说开发一个提醒类的应

  • Java 8新时间日期库java.time的使用示例

    Instant--它代表的是时间戳 LocalDate--不包含具体时间的日期,比如 2020-01-14.它可以用来存储生日,周年纪念日,入职日期等. LocalTime--它代表的是不含日期的时间 LocalDateTime--它包含了日期及时间,不过还是没有偏移信息或者说时区. ZonedDateTime--这是一个包含时区的完整的日期时间,偏移量是以 UTC / 格林威治时间为基准的. Java 8 是如何处理时间及日期的 示例 1 如何 在 Java 8 中获取当天的日期 LocalD

  • Python时间和日期库的实现

    在 Python 中是没有原生数据类型支持时间的,日期与时间的操作需要借助三个模块,分别是 time.datetime.calendar. time 模块可以操作 C 语言库中的时间相关函数,时钟时间与处理器运行时间都可以获取. datetime 模块提供了日期与时间的高级接口. calendar 模块为通用日历相关函数,用于创建数周.数月.数年的周期性事件. 在学习之前,还有一些术语要补充一下,这些术语你当成惯例即可.这里在 Python 官方文档中也有相关说明,不过信息比较多,橡皮擦为你摘录

  • Python日期时间处理库dateutil详解

    目录 简介 安装 初试 日期比较 相对时间 参考文献 简介 dateutil 为 Python 标准库 datetime 提供了强大的扩展 功能: 相对时间,如下周一.下个月.明年 两个日期间的差 灵活日期解析.使用iCalendar规范的超集,支持 RFC 字符串解析 几乎所有字符串格式的日期解析 实现各种各样格式文件 最新世界时区信息 计算任何给定年份的复活节星期日日期 全面的测试套件 安装 pip install python-dateutil 初试 from dateutil.parse

  • Java中的时间日期API知识点总结

    自从 14 年发布 Java 8 以后,我们古老 java.util.Date 终于不再是我们 Java 里操作日期时间的唯一的选择. 其实 Java 里的日期时间的相关 API 一直为世猿诟病,不仅在于它设计分上工不明确,往往一个类既能处理日期又能处理时间,很混乱,还在于某些年月日期的数值映射存储反人类,例如:0 对应月份一月,11 对应月份十二月,118 对应年份 2018(1900 + 118)等. 往往我们得到某个年月值还需要再做相应的运算才能得到准确的年月日信息,直到我们的 Java

  • Ruby日期时间的比较,日期转换等时间日期处理方法大全

    Ruby中Date.Time. DateTime这3个类提供 了和日期时间相关的操作. Date只能处理日期Time能处理日期和时间DateTime也能处理日期和时间 其中,DateTime 是Date的一个子类,是对时间部分数据的补充.要使用Date和DateTime类,只需导入date库就可以,要使用Time类,导入time库就行. require 'date' # 提供Date和DateTime类 require 'time' # 提供Time类(可直接使用,但导入后有更多方法) 一般来说

  • java基于正则表达式实现时间日期的常用判断操作实例

    本文实例讲述了java基于正则表达式实现时间日期的常用判断操作.分享给大家供大家参考,具体如下: 最近需要完成一个判断用户输入时间日期类型来进行相应操作的业务.实现这个功能自然少不了用到正则表达式,提高正则表达式的话,其实它的用法很简单,只需把这个表格记住并且会灵活运行就可以了. 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,"\n"匹配字符"n"."\\n"匹配一个换行符.序列&qu

随机推荐