1.2 Chrono Duration

首先看一下标准库的使用以及概念。首先是一个概念ratioratio表示的是一个概念,就是单位。

Durations表示的是一段时间。比如10秒钟,2个小时。

Ratio

template <intmax_t N, intmax_t D = 1> class ratio;

先看DD表示一秒可以被切分成多少份。N就是表示有多少份。

ratio<1, 1> seconds

这里就是表示1秒。

ratio<1, 1000> microseconds

这个就是表示毫秒。

另外一种简单的观点,就是N/D秒就是ratio的值。

比如

ratio<3600, 1> hours 3600/1 = 3600
ratio<60, 1> minutes 60/1 = 60
ratio<1, 1> seconds
ratio<1, 1000> microseconds
ratio<1, 1000000> microseconds
ratio<1, 1000000000> nanosecons

注意我们自己可以定义Period,比如ratio<1, -2>表示单位时间是-0.5秒。

Durations

这个用来表示一段时间,比如一天,2个小时,10秒钟。

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

Rep表示一种数值类型,用来表示Period的数量,比如int float double
Period是ratio类型,用来表示时间度量单位。比如经过了2纳秒。这里Period就是用ratio<1, 1000000000> nanosecons来表示。

转换

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast (const duration<Rep,Period>& dtn);

这个函数的作用是把一种duration转换成另外一种durantion的表达。

常用类型

当然,对于很多常用的时间类型,标准库里面也进行了定义。不过需要注意的是,这些不是一个常量,而是一个类型。

/// nanoseconds
typedef duration<int64_t, nano> nanoseconds;
/// microseconds
typedef duration<int64_t, micro> microseconds;
/// milliseconds
typedef duration<int64_t, milli> milliseconds;
/// seconds
typedef duration<int64_t> seconds
/// minutes
typedef duration<int64_t, ratio< 60>> minutes
/// hours
typedef duration<int64_t, ratio<3600>> hours;

所以在使用的时候,可以直接使用这些时间单位。比如休眠一段时间。

std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒
std::this_thread::sleep_for(std::chrono::milliseconds(100)); //休眠100毫秒

Count

有时候,也可以计算有多个少X为单位的时间。这个X可以是毫秒,也可能是纳秒等等。

#include <chrono>
#include <iostream>
int main() {
// 这里只有3毫秒,所以count结果为3.
std::chrono::milliseconds ms{3}; // 3 毫秒
// 6000 microseconds constructed from 3 milliseconds
// 这里单位变成了micro second
// 2*ms则是6ms,也就是6000微秒
std::chrono::microseconds us = 2*ms; //6000微秒
// 30Hz clock using fractional ticks
std::chrono::duration<double, std::ratio<1, 30>> hz30(3.5);
// 这里的输出是3.5
std::cout << "hz30 has" << hz30.count() << " ticks\n";
std::cout << "3 ms duration has " << ms.count() << " ticks\n"<< "6000 us duration has " << us.count() << " ticks\n";
return 0;
}

程序的输出

hz30 has3.5 ticks
3 ms duration has 3 ticks
6000 us duration has 6000 ticks

时间的计算

#include <chrono>
#include <iostream>
int main() {
std::chrono::minutes t1( 10 );
std::chrono::seconds t2( 60 );
std::chrono::seconds t3 = t1 - t2;
std::cout << t3.count() << " second" << std::endl;
return 0;
}

程序的输出

540 second

时间的转换

#include <chrono>
#include <iostream>
int main() {
std::chrono::minutes t1( 10 );
std::chrono::seconds t2( 60 );
std::chrono::seconds t3 = t1 - t2;
std::cout << t3.count() << " second" << std::endl;
std::cout <<
std::chrono::duration_cast<std::chrono::minutes>(t3).count()
<< "minutes" << std::endl;
return 0;
}