时间库
chrono 是一个头文件的名称,也是一个子命名空间的名称: 该头文件中的所有元素(common_type 特殊化除外)都不是直接定义在 std 名称空间下的(就像标准库中的大部分内容一样),而是定义在 std::chrono 名称空间下的。
该头文件中的元素与时间有关。 这主要是通过三个概念来实现的:
-
持续时间-Durations
它们测量时间跨度,如:一分钟、两小时或十毫秒。 在本库中,它们用持续时间类模板的对象来表示,耦合了计数表示法和周期精度(例如,十毫秒的计数表示法是十,周期精度是毫秒)。
-
时间点-Time points
对特定时间点的引用,如一个人的生日、今天的黎明或下一班火车经过的时间。 在本库中,time_point 类模板的对象通过使用相对于纪元的持续时间(这是使用相同时钟的所有 time_point 对象共有的固定时间点)来表达这一点。
-
时钟-Clocks
将时间点与实际物理时间相关联的框架。 该库至少提供了三种时钟,可将当前时间表示为一个时间点:system_clock(系统时钟)、steady_clock(稳定时钟)和 high_resolution_clock(高分辨率时钟)。
steady_clock(稳定时钟)
steady_clock 提供对当前时间点的访问。 专门用于计算时间间隔。
成员常数: is_steady:只能为true
成员类型
| 成员类型 | 默认值 | 描述 |
|---|---|---|
| rep | 有符号运算类型(或模拟该类型的类) | 用于存储周期(period)计数。 |
| period | 比例类型(分子/分母) | 表示一个周期(period)的时间长度,以秒为单位(可以表达小于1秒) |
| duration | duration<rep,period> | 时钟的持续时间类型。 |
| time_point | time_point<system_clock> | 时钟的时间点类型。 |
比如:rep*period等于经过了多少秒,也可以转换成微妙
成员函数
| 成员函数 | 描述 |
|---|---|
| now | 获取当前时间 |
/ steady_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
int main ()
{
using namespace std::chrono;
steady_clock::time_point t1 = steady_clock::now();
std::cout << "printing out 1000 stars...\n";
for (int i=0; i<1000; ++i) std::cout << "*";
std::cout << std::endl;
steady_clock::time_point t2 = steady_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
return 0;
}
system_clock(系统时钟)
提供对当前时点的访问。具体来说,system_clock 是一个全系统的实时时钟。
成员常数: is_steady: 一个 bool 值,指定时钟是否总是前进,以及是否相对于物理时间处于稳定状态。 如果为 "true",这意味着系统时钟可能不会被调整。
成员类型
| 成员类型 | 默认值 | 描述 |
|---|---|---|
| rep | 有符号运算类型(或模拟该类型的类) | 用于存储周期(period)计数。 |
| period | 比例类型 | 表示一个周期(period)的时间长度,以秒为单位 |
| duration | duration<rep,period> | 时钟的持续时间类型。 |
| time_point | time_point<system_clock> | 时钟的时间点类型。 |
成员函数
| 成员函数 | 描述 |
|---|---|
| now | 获取当前时间 |
| to_time_t | 转换为 time_t |
| from_time_t | 从 time_t 转换 |
// system_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
int main ()
{
using std::chrono::system_clock;
std::chrono::duration<int,std::ratio<60*60*24> > one_day (1);
system_clock::time_point today = system_clock::now();
system_clock::time_point tomorrow = today + one_day;
std::time_t tt;
tt = system_clock::to_time_t ( today );
std::cout << "today is: " << ctime(&tt);
tt = system_clock::to_time_t ( tomorrow );
std::cout << "tomorrow will be: " << ctime(&tt);
return 0;
}
Possible output:
today is: Wed May 30 12:25:03 2012
tomorrow will be: Thu May 31 12:25:03 2012
high_resolution_clock(高分辨率时钟)
高分辨率时钟(high_resolution_clock)是刻度周期最短的时钟。 它可能是 system_clock 或 steady_clock 的同义词, 不稳定。
持续时间-duration
template <class Rep, class Period = ratio<1> > class duration;
Rep:用于存储周期(period)的计数(count),类似于滴答数。
Period:以秒为单位表示周期的比率类型(分子/分母,可以表达小于1秒)。
持续时间对象通过计数和周期来表达时间跨度。
在内部,该对象将计数存储为成员类型 rep(第一个模板参数 Rep 的别名)的对象,可以通过调用成员函数 count 来获取。
count用周期(Period)表示。 周期的长度(在编译时)由第二个模板参数(Period)整合到类型中,这是一个比率类型,表示每个周期内经过的秒数(分子/分母的方式,可以表示比1秒更小的单位)。
模板初始化 该命名空间还定义了以下有关持续时间实例的方便类型定义:
| type | 描述 | Period |
|---|---|---|
| hours | 一小时的持续时间 | ratio<3600,1> |
| minutes | 一分钟的持续时间 | ratio<60,1> |
| seconds | 一秒钟的持续时间 | ratio<1,1> |
| milliseconds | 一毫秒的持续时间 | ratio<1,1000> |
| microseconds | 一微妙的持续时间 | ratio<1,1000000> |
| nanoseconds | 一纳秒的持续时间 | ratio<1,1000000000> |
成员类型
| 成员类型 | 默认值 | 描述 |
|---|---|---|
| rep | 有符号运算类型(或模拟该类型的类) | 用于存储周期(period)计数。 |
| period | 比例类型(分子/分母) | 表示一个周期(period)的时间长度,以秒为单位(可以表达小于1秒) |
构造
(1) duration() = default;
默认构造函数 :使用默认初始化的计数值构造一个对象。
(2)duration (const duration& dtn);
将对象初始化为 dtn 的持续时间。
(3)template<class Rep2, class Period2> constexpr duration (const duration<Rep2,Period2>& dtn);
将对象初始化为 dtn 的持续时间。
(4)template<class Rep2>constexpr explicit duration (const Rep2& n);
将对象初始化为计数为 n 的持续时间。
例子:
// duration constructor
#include <iostream>
#include <ratio>
#include <chrono>
int main ()
{
std::chrono::hours h_oneday (24); // 24h
std::chrono::seconds s_oneday (60*60*24); // 86400s
std::chrono::milliseconds ms_oneday (s_oneday); // 86400000ms
std::chrono::seconds s_onehour (60*60); // 3600s
//std::chrono::hours h_onehour (s_onehour); // NOT VALID (type truncates), use:
std::chrono::hours h_onehour (std::chrono::duration_cast<std::chrono::hours>(s_onehour));
std::chrono::milliseconds ms_onehour (s_onehour); // 3600000ms (ok, no type truncation)
std::cout << ms_onehour.count() << "ms in 1h" << std::endl;
return 0;
}
成员函数
constexpr rep count() const;
返回值是内部表示值的当前值,对象的表示值,表示周期数。用类的周期间隔表示,不一定是秒。
// duration::count
#include <iostream> // std::cout
#include <chrono> // std::chrono::seconds, std::chrono::milliseconds
// std::chrono::duration_cast
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;
}