C++ 日期处理:chrono、date.h 和 Boost.DateTime 库

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

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

开始课程

C++ 日期处理:现代库概览



日期和时间处理是软件开发中的关键任务之一。在 C++ 中,长期以来缺乏便捷的标准工具,导致不得不使用 C 语言函数(如 ctime、localtime)或第三方解决方案。然而,随着 C++11 及后续标准的到来,情况发生了根本性变化。本文将介绍 C++ 中处理日期的三种主要方法:标准库 std::chrono、Howard Hinnant 的 date.h 扩展以及强大的 Boost.DateTime 框架。



1. 标准库 std::chrono(C++11 及更高版本)



std::chrono 是 C++ 标准库的一部分,提供了表示时间点(time_point)、时长(duration)和时钟(clock)的类型。它非常适合测量时间间隔、处理定时器和高精度延迟。然而,在 C++20 之前,它缺乏处理日历日期(年、月、日)的便捷工具。



示例:测量代码执行时间

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

int main() { auto start = std::chrono::high_resolution_clock::now();

// 模拟工作 std::this_thread::sleep_for(std::chrono::milliseconds(500));

auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

std::cout << "执行时间: " << duration.count() << " 毫秒"; return 0;}


从 C++20 开始,std::chrono 增加了对日历的支持:类型 year、month、day、year_month_day 以及用于操作它们的运算符。现在可以这样写:

#include <chrono>#include <iostream>

int main() { using namespace std::chrono; auto today = floor<days>(system_clock::now()); year_month_day ymd{today}; std::cout << int(ymd.year()) << "-" << unsigned(ymd.month()) << "-" << unsigned(ymd.day()) << ""; return 0;}


2. date.h 库(Howard Hinnant)



在 C++20 发布之前,开发者广泛使用 date.h 库——这是 Howard Hinnant 编写的 std::chrono 单文件扩展。它提供了完整的日期处理功能:解析、格式化、计算日期差、时区处理,甚至支持儒略历。



示例:将字符串解析为日期

#include "date.h"#include <iostream>#include <sstream>

int main() { std::istringstream ss("2025-04-07"); date::sys_days tp; ss >> date::parse("%F", tp); // ISO 8601 格式 auto ymd = date::year_month_day{tp}; std::cout << "年: " << int(ymd.year()) << ""; return 0;}


示例:计算年龄

#include "date.h"#include <iostream>

int main() { using namespace date; auto birth = sys_days{year{1990}/month{1}/day{15}}; auto today = floor<days>(std::chrono::system_clock::now()); auto age = today - birth; std::cout << "年龄(天): " << age.count() << ""; // 年龄(近似年) auto years = duration_cast<std::chrono::years>(age); std::cout << "年龄(年): " << years.count() << ""; return 0;}


date.h 库易于集成(只需复制头文件)且无需编译。它成为了 C++20 中标准 std::chrono 的基础。

推荐