C++日期处理:最佳时间操作库概览

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

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

开始课程

在C++中处理日期:主要库概览



处理日期和时间是编程中的基本任务之一。在C++中,标准库长期局限于来自C语言(<ctime>)的工具,这些工具使用不便且类型不安全。从C++11开始,尤其是C++20,情况发生了根本性变化。本文将介绍现代C++中处理日期的三种主要方法。



1. 标准库 <chrono> (C++11 和 C++20)



从C++11开始,标准库引入了<chrono>头文件,提供了类型安全的时钟、时间点(time_point)和时间段(duration)。在C++20中,该库扩展了对日历类型(年、月、日)和时区的支持。



主要组件:

  • std::chrono::system_clock — 系统时钟,与真实时间关联。
  • std::chrono::steady_clock — 单调时钟,用于测量时间间隔。
  • std::chrono::duration — 时间段(例如秒、毫秒)。
  • std::chrono::time_point — 时间点。
  • 日历类型 (C++20):year_month_day、hh_mm_ss 等。


#include <iostream>#include <chrono>#include <format> // C++20

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

// 当前时间 auto now = system_clock::now(); std::cout << "Текущее время: " << now << "";

// 转换为日历日期 (C++20) auto dp = floor<days>(now); year_month_day ymd{dp}; std::cout << "Год: " << (int)ymd.year() << "";

// 测量时间间隔 auto start = steady_clock::now(); // ... 某些代码 ... auto end = steady_clock::now(); auto diff = end - start; std::cout << "Прошло: " << duration_cast<milliseconds>(diff).count() << " мс"; return 0;}


优点:内置于标准,类型安全,持续发展。

缺点:C++20需要现代编译器(GCC 12+、Clang 14+、MSVC 2022)。



2. Boost.DateTime



Boost.DateTime库是处理日期方面最古老且最成熟的库之一。在C++20出现之前,它实际上是事实上的标准。它提供了boost::gregorian::date、boost::posix_time::ptime类以及完整的时区支持。



主要功能:

  • 格里高利历,支持闰年。
  • 日期操作:加减天数、月数、年数。
  • 通过boost::date_time::date_facet进行格式化和解析。
  • 通过boost::local_time支持时区。


#include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>

int main() { using namespace boost::gregorian; using namespace boost::posix_time;

// 创建日期 date d(2024, 12, 25); std::cout << "Дата: " << d << ""; // 2024-Dec-25

// 天数相加 date next_week = d + days(7); std::cout << "Через неделю: " << next_week << "";

// 日期之间的差值 days diff = next_week - d; std::cout << "Разница: " << diff.days() << " дней";

// 精确到秒的当前时间 ptime now = second_clock::local_time(); std::cout << "Сейчас: " << now << ""; return 0;}


优点:久经考验,文档丰富,支持C++98。

推荐