C++ 日期和时间处理:高级进阶

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ 中日期和时间的高级处理:从 chrono 到时区

\n\n

日期和时间处理是开发高负载系统、日志记录、金融应用程序和调度器时的关键任务之一。C++ 标准库提供了强大的工具集,从简单的 time_t 到现代的 <chrono>。本文将深入探讨高级技术:精确测量、时区、格式化和间隔计算。

\n\n

1. chrono 库:duration、time_point 和 clocks

\n\n

标准库 <chrono>(C++11 及更高版本)提供了表示时间点(time_point)、持续时间(duration)和时钟(clock)的类型。这使得编写跨平台代码成为可能。

\n\n
#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
\n\n

2. 系统时间与日历日期的转换

\n\n

要处理日历日期(年、月、日),请使用 system_clock 以及 to_time_t / from_time_t 函数。从 C++20 开始,出现了更方便的工具,但我们将介绍经典方法。

\n\n
#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 相同。

\n\n

3. 时区与 C++20

\n\n

在 C++20 之前,时区处理非常复杂。C++20 引入了 <chrono> 库对 time_zone 和 zoned_time 的支持。如果您的编译器支持 C++20(GCC 12+、Clang 15+、MSVC 2022 17.4+),您可以使用

博客

书籍推荐