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学习的主要内容,如果未能解决你的问题,请参考以下文章