此头文件是日期和时间库的一部分。类模板 std::chrono::duration
表示时间间隔。它由 Rep
类型的计次数和计次周期组成,其中计次周期是一个编译期有理f,表示从一个计次到下一个的秒数。在 duration
存储的数据只有 Rep
类型的计次数。若 Rep
是浮点类型,则 duration
能表示小数的计次数。Period
被包含为时长类型的一部分,且只在不同时长间转换时使用。
成员函数
构造新 duration (公开成员函数) |
|
赋值内容 (公开成员函数) |
|
返回计次的计数 (公开成员函数) |
|
[静态] |
返回特殊时长值零 (公开静态成员函数) |
[静态] |
返回特殊时长值最小值 (公开静态成员函数) |
[静态] |
返回特殊时长值最大值 (公开静态成员函数) |
实现一元 + 和一元 - (公开成员函数) |
|
自增或自减计次数 (公开成员函数) |
|
实现两个时长间的复合赋值 (公开成员函数) |
非成员函数
(C++11) |
转换时长到另一个拥有不同计次间隔的时长 (函数模板) |
(C++17) |
以向下取整的方式,将一个时长转换为另一个时长 (函数模板) |
(C++17) |
以向上取整的方式,将一个时长转换为另一个时长 (函数模板) |
(C++17) |
转换时长到另一个时长,就近取整,偶数优先 (函数模板) |
(C++17) |
获取时长的绝对值 (函数模板) |
示例代码:
#include <chrono>
#include <ratio>
#include <iostream>
#include <thread>
// duration TYPES
//using nanoseconds = duration<long long, nano>;
//using microseconds = duration<long long, micro>;
//using milliseconds = duration<long long, milli>;
//using seconds = duration<long long>;
//using minutes = duration<int, ratio<60>>;
//using hours = duration<int, ratio<3600>>;
void fun()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
// duration constructor example
std::chrono::hours ho(3); //3小时
std::chrono::milliseconds ms{ 3 }; //3毫秒
std::chrono::duration<int, std::kilo> ks(3); //3000秒
//使用小数计次 30Hz时错
std::chrono::duration<double, std::ratio<1, 30>> hz30(3.5);
//从3毫秒构造 3000 微秒
std::chrono::microseconds us = ms;
std::chrono::duration<double, std::milli> ms2 = us; // 3.0 毫秒
// duration::count example
std::cout << "ho========" << ho.count() << "\n";
std::cout << "ms========" << ms.count() << "\n";
std::cout << "ks========" << ks.count() << "\n";
std::cout << "hz30======" << hz30.count() << "\n";
std::cout << "us========" << us.count() << "\n";
std::cout << "ms2=======" << ms2.count() << "\n";
// duration operators= example
std::chrono::minutes min{ 1 }; //1分钟
std::chrono::seconds sec = min; //60秒
std::chrono::milliseconds mil = min;//60 * 1000毫秒
std::chrono::microseconds mic = min;//60 * 1000 * 1000微秒
std::chrono::nanoseconds nan = min; //60 * 1000 * 1000 *1000纳秒
std::cout << "min=======" << min.count() << "\n";
std::cout << "sec=======" << sec.count() << "\n";
std::cout << "mil=======" << mil.count() << "\n";
std::cout << "mic=======" << mic.count() << "\n";
std::cout << "nan=======" << nan.count() << "\n";
std::chrono::duration<int> foo{ 0 };
std::chrono::duration<int> bar{ 10 };
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
//value foo bar
foo = bar; // 10 10
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
foo = foo + bar; // 20 10
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
++foo; // 21 10
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
--bar; // 21 9
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
foo *= 2; // 42 9
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
foo /= 3; // 14 9
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
bar += (foo % bar); // 14 14
std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";
// duration::zero example
using std::chrono::steady_clock;
steady_clock::time_point t1 = steady_clock::now();
std::cout << "Printing out something...\n";
steady_clock::time_point t2 = steady_clock::now();
steady_clock::duration d = t2 - t1;
if (d == steady_clock::duration::zero())
std::cout << "The internal clock did not tick.\n";
else
std::cout << "The internal clock advanced " << d.count() << " periods.\n";
steady_clock::time_point t3 = t1;
steady_clock::duration d3 = t3 - t1;
if (d3 == steady_clock::duration::zero())
std::cout << "The internal clock did not tick.\n";
else
std::cout << "The internal clock advanced " << d3.count() << " periods.\n";
std::cout << "steady_clock::duration::zero()=========" << steady_clock::duration::zero().count() << '\n';
// duration::min/max example
std::cout << "system_clock durations can represent:\n";
std::cout << "min: " << std::chrono::system_clock::duration::min().count() << "\n";
std::cout << "max: " << std::chrono::system_clock::duration::max().count() << "\n";
const auto t11 = std::chrono::high_resolution_clock::now();
fun();
const auto t12 = std::chrono::high_resolution_clock::now();
// 浮点时长:不需要 duration_cast
const std::chrono::duration<double, std::milli> fp_ms = t12 - t11;
// 整数时长:必须 duration_cast
const auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t12 - t11);
// 将整数时长转换为更短可整除的时间单位的整数时长:不需要 duration_cast
const std::chrono::duration<long, std::micro> int_usec = int_ms;
std::cout << "fun() use " << fp_ms.count() << " or " << int_ms.count() << " ms, or " << int_usec.count() << " mic\n";
//std::cout << "f()用了" << fp_ms.count() << ", 或 " << int_ms.count() << " (整毫秒), 或" << int_usec.count() << " (整微秒)\n";
//floor, round, ceil example
using namespace std::chrono_literals;
using Sec = std::chrono::seconds;
std::chrono::milliseconds ms5499{ 5499 }; //5499毫秒
std::cout << std::showpos << ms5499.count() << "\t\t"
<< std::chrono::floor<Sec>(ms5499).count() << '\t' //向下取整
<< std::chrono::round<Sec>(ms5499).count() << '\t' //就近取整
<< std::chrono::ceil <Sec>(ms5499).count() << '\n'; //向上取整
std::chrono::milliseconds ms5501{ 5501 }; //5501毫秒
std::cout << std::showpos << ms5501.count() << "\t\t"
<< std::chrono::floor<Sec>(ms5501).count() << '\t' //向下取整
<< std::chrono::round<Sec>(ms5501).count() << '\t' //就近取整
<< std::chrono::ceil <Sec>(ms5501).count() << '\n'; //向上取整
return 0;
}
运行结果:
参考: