chrono时间和日期库学习

此头文件是日期和时间库的一部分。类模板 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 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;
}


运行结果:

参考:

https://cplusplus.com/reference/chrono/duration/

https://zh.cppreference.com/w/cpp/header/chrono

相关推荐

  1. Python 日期时间

    2024-07-13 00:54:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 00:54:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 00:54:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 00:54:03       58 阅读
  4. Python语言-面向对象

    2024-07-13 00:54:03       69 阅读

热门阅读

  1. 「AIGC」TDSQL技术详解

    2024-07-13 00:54:03       19 阅读
  2. Ultralytics YoloV8库可完成任务介绍

    2024-07-13 00:54:03       25 阅读
  3. Oracle 19c RAC 心跳异常处理

    2024-07-13 00:54:03       19 阅读
  4. 音频demo:将PCM数据和opus格式相互编解码

    2024-07-13 00:54:03       28 阅读
  5. 算术运算符. 二

    2024-07-13 00:54:03       26 阅读
  6. matlab实现pid控制机械系统

    2024-07-13 00:54:03       18 阅读
  7. Http网络通信流程

    2024-07-13 00:54:03       18 阅读
  8. Mojolicious测试驱动开发:单元与集成测试的艺术

    2024-07-13 00:54:03       23 阅读