C++ 中日期和时间的高级处理:chrono、time_t 与解析

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

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

开始课程

引言:为什么 C++ 中标准的时间处理变得更复杂(也更好)了

长期以来,C++ 中日期和时间的处理主要依赖于 <ctime> 中的函数:time()、localtime()、strftime()。这对于简单任务来说已经足够,但随着项目复杂度的增加(分布式系统、高负载服务器、金融应用),需要更精确、更安全、更方便的工具。

C++11 标准为我们带来了 <chrono> 库,它解决了溢出问题、单位混淆以及平台依赖性问题。C++20 向前迈出了重要一步,增加了对时区、日历类型的支持,并通过 std::format 实现了格式化。在本文中,我们将探讨超越简单获取当前时间的高级技术。



1. chrono 库:从毫秒到纳秒再到日历

std::chrono 的核心是三个组件:时钟 (clock)、时长 (duration) 和 时间点 (time_point)。在高级层面,重要的是能够选择合适的时钟并处理时间运算。



1.1. 选择时钟:system_clock、steady_clock、high_resolution_clock

  • system_clock — 表示系统时间(日历时间)。可能被用户或同步服务(NTP)调整。用于向用户显示日期。
  • steady_clock — 单调时钟。永远不会被向后调整(无回滚)。非常适合测量时间间隔(定时器、性能分析)。
  • high_resolution_clock — 具有最小可能滴答周期的时钟。在大多数平台上,它是 steady_clock 的同义词。

高级建议: 如果您需要稳定性,切勿使用 high_resolution_clock 进行性能分析。请使用 steady_clock。



1.2. 处理 duration 和 time_point

高级处理不仅仅是测量时间,还包括单位之间的转换、运算和自定义类型。

#include <iostream>#include <chrono>#include <thread>

int main() { using namespace std::chrono_literals; // 用于 ms, s, us 后缀

// 高级 duration 创建 auto work_time = 2h + 30min + 15s; // 2 小时 30 分钟 15 秒 std::cout << "工作时间(秒): " << work_time.count() << " s";

// 带舍入的转换 (duration_cast) auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(work_time); std::cout << "毫秒数: " << ms.count() << " ms";

// 测量函数执行时间 auto start = std::chrono::steady_clock::now(); std::this_thread::sleep_for(100ms); // 模拟工作 auto end = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "函数执行时间: " << elapsed.count() << " 微秒";

return 0;}


1.3. 日历类型 (C++20)

C++20 添加了 year_month_day、year_month、weekday 等类型。这使得无需处理原始数字即可安全地操作日期。

#include <iostream>#include <chrono>

int main() { using namespace std::chrono;

// 创建日期 auto date = 2023y / October / 15d; // 2023 年 10 月 15 日 std::cout << "日期: " << date << '';

// 添加天数 auto next_week = date + days(7); std::cout << "一周后: " << next_week << '';

// 获取星期几 weekday wd{date}; std::cout << "星期几: " << wd << '';

return 0;}

博客

书籍推荐