C++ 中日期和时间的高级处理:从 chrono 到时区
\n\n日期和时间处理是开发高负载系统、日志记录、金融应用程序和调度器时的关键任务之一。C++ 标准库提供了强大的工具集,从简单的 time_t 到现代的 <chrono>。本文将深入探讨高级技术:精确测量、时区、格式化和间隔计算。
1. chrono 库:duration、time_point 和 clocks
\n\n标准库 <chrono>(C++11 及更高版本)提供了表示时间点(time_point)、持续时间(duration)和时钟(clock)的类型。这使得编写跨平台代码成为可能。
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n using namespace std::chrono;\n\n // 记录开始时间\n auto start = high_resolution_clock::now();\n\n // 模拟工作\n std::this_thread::sleep_for(milliseconds(500));\n\n auto end = high_resolution_clock::now();\n\n // 计算持续时间\n auto duration = duration_cast<milliseconds>(end - start);\n std::cout << "已过时间: " << duration.count() << " 毫秒\\n";\n\n // 以不同单位处理 duration\n seconds sec(1);\n milliseconds ms = sec; // 隐式转换(无损)\n // milliseconds ms2 = duration_cast<milliseconds>(sec); // 显式转换\n std::cout << "1 秒 = " << ms.count() << " 毫秒\\n";\n\n return 0;\n}\n\n关键点:
\n- \n
duration_cast— 单位之间的转换(可能会损失精度)。 \n high_resolution_clock— 最高精度的时钟(通常是系统定时器的封装)。 \n system_clock— 系统时间,与日历关联。 \n steady_clock— 单调时钟,非常适合测量间隔。 \n
2. 系统时间与日历日期的转换
\n\n要处理日历日期(年、月、日),请使用 system_clock 以及 to_time_t / from_time_t 函数。从 C++20 开始,出现了更方便的工具,但我们将介绍经典方法。
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n using namespace std::chrono;\n\n // 当前系统时间\n auto now = system_clock::now();\n std::time_t now_c = system_clock::to_time_t(now);\n\n // 转换为本地时间\n std::tm* local = std::localtime(&now_c);\n std::cout << "本地时间: " \n << std::put_time(local, "%Y-%m-%d %H:%M:%S") << "\\n";\n\n // 从日历日期创建 time_point(C++20 将简化此过程)\n std::tm date = {};\n date.tm_year = 2025 - 1900; // 年份从 1900 开始\n date.tm_mon = 3; // 四月(0-11)\n date.tm_mday = 15;\n date.tm_hour = 12;\n date.tm_min = 30;\n date.tm_sec = 0;\n std::time_t date_c = std::mktime(&date);\n auto date_point = system_clock::from_time_t(date_c);\n\n // 计算天数差\n auto diff = duration_cast<hours>(now - date_point).count() / 24;\n std::cout << "自 2025-04-15 以来的天数: " << diff << "\\n";\n\n return 0;\n}\n\n重要提示: std::put_time 从 C++11 开始可用。格式说明符与 strftime 相同。
3. 时区与 C++20
\n\n在 C++20 之前,时区处理非常复杂。C++20 引入了 <chrono> 库对 time_zone 和 zoned_time 的支持。如果您的编译器支持 C++20(GCC 12+、Clang 15+、MSVC 2022 17.4+),您可以使用