此头文件是日期和时间库的一部分。类模板 std::chrono::duration
表示时间间隔。它由 Rep
类型的计次数和计次周期组成,其中计次周期是一个编译期有理f,表示从一个计次到下一个的秒数。在 duration
存储的数据只有 Rep
类型的计次数。若 Rep
是浮点类型,则 duration
能表示小数的计次数。Period
被包含为时长类型的一部分,且只在不同时长间转换时使用。
成员函数
(构造函数) | 构造新 duration (公开成员函数) |
operator= | 赋值内容 (公开成员函数) |
count | 返回计次的计数 (公开成员函数) |
zero [静态] | 返回特殊时长值零 (公开静态成员函数) |
min [静态] | 返回特殊时长值最小值 (公开静态成员函数) |
max [静态] | 返回特殊时长值最大值 (公开静态成员函数) |
operator+operator- | 实现一元 + 和一元 - (公开成员函数) |
operator++operator++(int)operator--operator--(int) | 自增或自减计次数 (公开成员函数) |
operator+=operator-=operator*=operator/=operator%= | 实现两个时长间的复合赋值 (公开成员函数) |
非成员函数
duration_cast (C++11) | 转换时长到另一个拥有不同计次间隔的时长 (函数模板) |
floor(std::chrono::duration) (C++17) | 以向下取整的方式,将一个时长转换为另一个时长 (函数模板) |
ceil(std::chrono::duration) (C++17) | 以向上取整的方式,将一个时长转换为另一个时长 (函数模板) |
round(std::chrono::duration) (C++17) | 转换时长到另一个时长,就近取整,偶数优先 (函数模板) |
abs(std::chrono::duration) (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 examplestd::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 examplestd::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= examplestd::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 barfoo = bar; // 10 10std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";foo = foo + bar; // 20 10std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";++foo; // 21 10std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";--bar; // 21 9std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";foo *= 2; // 42 9std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";foo /= 3; // 14 9std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";bar += (foo % bar); // 14 14std::cout << "foo=======" << foo.count() << "\t" << "bar=======" << bar.count() << "\n";// duration::zero exampleusing 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";elsestd::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";elsestd::cout << "The internal clock advanced " << d3.count() << " periods.\n";std::cout << "steady_clock::duration::zero()=========" << steady_clock::duration::zero().count() << '\n';// duration::min/max examplestd::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_castconst std::chrono::duration<double, std::milli> fp_ms = t12 - t11;// 整数时长:必须 duration_castconst auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t12 - t11);// 将整数时长转换为更短可整除的时间单位的整数时长:不需要 duration_castconst 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 exampleusing 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;
}
运行结果:
参考:
https://cplusplus.com/reference/chrono/duration/
https://zh.cppreference.com/w/cpp/header/chrono