文章目录
- 1. 概述
- 2. 时间点(Time Points)
- 3. 时间间隔(Durations)
- 4. 时钟(Clocks)
- 5. 时间算术
- 6. 时间转换
- 7. 延时
- 参考
1. 概述
std::chrono 是 C++11 引入的一个库,用于处理日期和时间。它提供了一套丰富的类和函数,允许开发者以高精度(通常是纳秒级)来测量时间间隔、表示时间点、以及进行时间的算术运算。下面是对 std::chrono 库中一些关键组件的详细解释。
2. 时间点(Time Points)
时间点是表示特定时间(如现在、某个过去或未来的时间点)的类。std::chrono 库中,std::chrono::time_point 是一个模板类,通常与特定的时钟(clock)一起使用,如 std::chrono::system_clock、std::chrono::steady_clock 或 std::chrono::high_resolution_clock。
#include <chrono>
#include <iostream>
int main() {
auto now = std::chrono::system_clock::now(); // 获取当前时间点
std::cout << "当前时间: " << now.time_since_epoch().count() << " ticks\n";
// 注意:time_since_epoch() 返回的是自纪元(通常是1970年1月1日)以来的时间间隔
}
3. 时间间隔(Durations)
时间间隔表示两个时间点之间的时间长度。std::chrono 库中,std::chrono::duration 是一个模板类,用于表示时间长度。它通常与数值类型和单位(如秒、毫秒、纳秒等)一起使用。
#include <chrono>
#include <iostream>
int main() {
auto duration = std::chrono::seconds(5); // 5秒的时间间隔
std::cout << "时间间隔: " << duration.count() << " 秒\n";
}
4. 时钟(Clocks)
时钟是 std::chrono 库中用于测量时间的工具。C++ 标准库提供了三种时钟:
- std::chrono::system_clock:表示系统范围的时间点,可用于获取当前时间,并可以转换为 std::time_t 类型,以便与 C 风格的日期和时间函数互操作。
- std::chrono::steady_clock:提供单调递增的时间点,适合测量时间间隔。它不受系统时间调整的影响。
- std::chrono::high_resolution_clock:提供最高可用分辨率的时间点,通常等同于 steady_clock 或 system_clock 中分辨率较高的一个。
5. 时间算术
std::chrono 库支持时间点和时间间隔的算术运算,如加法、减法、比较等。
#include <chrono>
#include <iostream>
int main() {
auto now = std::chrono::system_clock::now();
auto future = now + std::chrono::hours(24); // 24小时后的时间点
std::cout << "24小时后: " << std::chrono::system_clock::to_time_t(future) << std::endl;
auto duration = future - now; // 计算时间间隔
std::cout << "时间间隔: " << duration.count() << " 秒\n";
}
6. 时间转换
std::chrono 库还提供了将时间点和时间间隔转换为不同单位或格式的功能。例如,std::chrono::duration_cast 可以用于在不同时间单位之间转换时间间隔。
#include <chrono>
#include <iostream>
int main() {
auto duration = std::chrono::seconds(5);
auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
std::cout << "5秒 = " << milliseconds.count() << " 毫秒\n";
}
7. 延时
std::chrono 本身并不直接提供延时(即让程序暂停执行一段时间)的功能。std::chrono 主要用于时间的测量、表示和算术运算,而不是控制程序的执行流程。
然而,你可以结合 std::chrono 和 C++11 引入的其他特性(如 库中的 std::this_thread::sleep_for 或 std::this_thread::sleep_until)来实现延时功能。
以下是使用 std::this_thread::sleep_for 和 std::chrono 实现延时的示例:
#include <iostream>
#include <chrono>
#include <thread>
int main() {
std::cout << "延时开始..." << std::endl;
// 延时2秒
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "延时结束!" << std::endl;
return 0;
}
在这个示例中,std::chrono::seconds(2) 创建了一个表示2秒时间间隔的 std::chrono::duration 对象,然后 std::this_thread::sleep_for 函数使用这个对象来让当前线程暂停执行2秒。
类似地,如果你想要在某个特定时间点之后唤醒线程,你可以使用 std::this_thread::sleep_until 函数,并传递一个 std::chrono::time_point 对象作为参数。但是,由于 std::chrono::time_point 是与时钟相关联的,你需要确保你传递的时间点与你选择的时钟(如 std::chrono::system_clock)相匹配。然而,在实际应用中,由于系统时钟可能会受到系统时间调整的影响,通常更推荐使用 std::chrono::steady_clock 来测量时间间隔,并使用 std::this_thread::sleep_for 来实现延时,因为这样做更加可靠和精确。
总之,std::chrono 库为 C++ 提供了强大而灵活的时间处理功能,使得开发者能够以高精度和灵活性来测量时间间隔、表示时间点,并进行时间的算术运算和转换。
参考
【1】C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
【2】C++ 标准库
【3】C++11 std::chrono库详解