C++:Reference:chrono学习

Posted John_xx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++:Reference:chrono学习相关的知识,希望对你有一定的参考价值。

chrono

概述

Time library

  • chrono 是 header 名称,也是子命名空间的名称:此header头中的所有元素不是直接在std命名空间下定义的(这与大多数标准库一样),而是在 std::chrono命名空间下定义。
  • 在 chrono header 文件中的元素是处理时间的,主要通过下面三个概念实现。

1:Durations

  • 它测量的是时间跨度,比如:一分钟,两小时或十毫秒。
  • 在这个库中,用持续时间类模板对象来表示:该模板将计数表示和周期精度相耦合(例如:10毫秒,10作为计数表示,毫秒作为周期精度)。

1.1 :Duration构造函数

#include<iostream>
#include<ratio>
#include<chrono>
int main()

	// 定义一个秒为单位来衡量时间间隔的情况。
	typedef std::chrono::duration<int> seconds_type;
	// 这里定义了一个duration类型,这个类型需要两个参数:第一个参数是时间长度的类型(int类型),第二个参数是时间单位(这里是毫秒)
	typedef std::chrono::duration<int,std::milli> milliseconds_type;
	// 这里定义了一个duration类型,这个类型需要两个参数,第一个参数指定了时间长度的基本单位(在这里是int 表示是整数),第二个参数指定时间之间的比例关系(在这里是:std::ratio<60*60>,表示一小时等于60分钟,一分钟等于60秒)
	// 所以, houre_type表示:以小时为单位的时长,可以用来定义变量,函数返回值等等。
	typedef std::chrono::duration<int,std::ratio<60*60>> hours_type;

	hours_type h_oneday(24);  // 24h
    std::cout << h_oneday.count() << std::endl;

	seconds_type s_oneday(h_oneday);  // 86400s
    std::cout << s_oneday.count() << std::endl;

	milliseconds_type ms_day(s_oneday);
	std::cout << ms_day.count() << std::endl;


// 打印结果
24
86400
86400000

1.2 静态成员函数count

函数原型
constexpr rep count() const;
返回值
此duration 的计次数。

std::cout << foo.count() * milliseconds::period::num / milliseconds::period::den;

 - 这是C++ 用来输出时间间隔的代码,其中 foo是 duration类型的一个变量
 - count() 用于获取foo的时间长度数量(计次数)
 - millisseconds::period::num 和 milliseconds::period::den
 - 是C++标准库中duration常量,
 -  milliseconds 时钟周期转换为浮点数表示的秒数。其中,milliseconds::period::num 表示时钟周期中每秒的计数,milliseconds::period::den 表示秒数的计数。
 - 通过除法运算可以得到每个时钟周期所表示的秒数。

#include<iostream>
#include<chrono>
int main()

	using namespace std::chrono;
	// std::chrono::milliseconds is an instatiation of std::chrono::duration
	milliseconds foo(1000);  // 1 second
	foo*=60;
	std::cout << "duration (in periods):";
	std::cout<< foo.count() << " milliseconds.\\n";

    std::cout<< " duration (in seconds): ";
    std::cout << foo.count()*milliseconds::period::num/milliseconds::period::den;
    std::cout<< " seconds.\\n";
    return 0;


//  打印结果
 duration (in periods):60000 milliseconds.
 duration (in seconds): 60 seconds.

1.3 duration_cast分析

将duration的值转换其他持续时间类型,同时也考虑它们之间的差异性。

Example
#include<iostream>
#include<chrono>
int main()

	std::chrono::seconds sec(1);  // 1s
	std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds> (sec);
	ms += std::chrono::milliseconds(2500); // 2500 millisecond
	sec = std::chrono::duration_cast<std::chrono::seconds>(ms);

   std::cout << "millseconds: " << ms.count() <<std::endl;
   std::cout << "senconds: " << sec.count() << std::endl;
	


打印结果
illseconds: 3500
senconds: 3

2:Time points

  • 它表示一个特定的时间点,比如一个人的生日,今天的黎明,或者下一班火车经过的时间点。
  • 在这个库中 :time_point 类模板的对象通过使用相对于 epoch的持续时间来表达这一点。
  • 相对于epoch 持续时间: 指的是一个特定的时间:1970-01-01 00:00:00 UTC
  • 在内部,该对象存储一个持续时间类型的对象,并使用Clock类型作为其 epoch的引用。
  • 💚💚💚
  • Importantly
  • A Clock class ,Such as system_clock steady_clock , high_resolution_clock or a custom clock

3:clocks

  • 它是一种框架:一种将时间点与实际物理时间联系起来的矿建
  • 此库提供了至少三个时钟,它们提供了将当前时间表示为时间点的方法:system_clock , steady_clock , high_resolution_clock

C++ chrono 获取当前时间

代码

#include <chrono>
#include <ctime>
#include <iostream>

int main() 
  using namespace std;
  using namespace std::chrono;

  // 获取当前时间
  system_clock::time_point now = system_clock::now();

  // 距离1970-01-01 00:00:00的纳秒数
  chrono::nanoseconds d = now.time_since_epoch();
  cout << "current nanoseconds: " << d.count() << endl;

  // 转换为微秒数, 会有精度损失
  chrono::microseconds mcrosec = chrono::duration_cast<chrono::microseconds>(d);
  cout<<"current microseconds: " << mcrosec.count() << endl;

  // 转换为毫秒数, 会有精度损失
  chrono::milliseconds millsec = chrono::duration_cast<chrono::milliseconds>(d);
  cout<<"current milliseconds: " << millsec.count() << endl;
  
  // 转换为秒数,会有精度损失
  chrono::seconds sec = chrono::duration_cast<chrono::seconds>(d);
  cout<<"current seconds: " << sec.count() << endl;

  // 转换为秒数,会有精度损失
  chrono::minutes minutes = chrono::duration_cast<chrono::minutes>(d);
  cout<<"current minutes: " << minutes.count() << endl;

  // 转换为小时
  chrono::hours hours = chrono::duration_cast<chrono::hours>(d);
  cout<<"current hours: "<<hours.count()<<endl;

  // 转换为天
  typedef chrono::duration<int,ratio<24*60*60>> Day;
  Day days = chrono::duration_cast<Day>(d);
  cout<<"current days: "<<days.count()<<endl;

  // 转换成ctime中的time_t类型
  time_t tt = system_clock::to_time_t(now);

  // 输出时间
  cout << "string format: " << ctime(&tt) << endl;
  return 0;

运行结果

chrono介绍

chrono头文件中主要包括三个类:

更多的信息参考: http://www.cplusplus.com/reference/chrono/

以上是关于C++:Reference:chrono学习的主要内容,如果未能解决你的问题,请参考以下文章

C++ chrono 获取当前时间

C++ 中的时序逻辑错误(使用 std::chrono)

蓝桥ROS机器人之现代C++学习笔记7.3 期物

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

从 C++ 中的 std::chrono::time_point 中提取年/月/日等

使用 std::chrono 在 C++ 中输出日期和时间