首先看一下标准库的使用以及概念。首先是一个概念ratio
,ratio
表示的是一个概念,就是单位。
Durations表示的是一段时间。比如10秒钟,2个小时。
Ratio
template <intmax_t N, intmax_t D = 1> class ratio;
|
先看D
,D
表示一秒可以被切分成多少份。N
就是表示有多少份。
这里就是表示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的表达。
常用类型
当然,对于很多常用的时间类型,标准库里面也进行了定义。不过需要注意的是,这些不是一个常量,而是一个类型。
typedef duration<int64_t, nano> nanoseconds; typedef duration<int64_t, micro> microseconds; typedef duration<int64_t, milli> milliseconds; typedef duration<int64_t> seconds typedef duration<int64_t, ratio< 60>> minutes 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));
|
Count
有时候,也可以计算有多个少X
为单位的时间。这个X
可以是毫秒,也可能是纳秒等等。
#include <chrono> #include <iostream> int main() { std::chrono::milliseconds ms{3}; std::chrono::microseconds us = 2*ms; std::chrono::duration<double, std::ratio<1, 30>> hz30(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; }
|
程序的输出
时间的转换
#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; }
|