C++ 日期与时间处理:完整指南

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

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

开始课程

在C++中处理日期和时间:从经典到现代标准



管理日期和时间是软件开发中的关键任务之一。无论是事件日志记录、截止日期计算、定时器操作还是数据分析——可靠的工具都是必不可少的。在C++中,有几种方法可以实现这一点:从经典的<ctime>库到现代C++11引入并在C++20中得到显著扩展的<chrono>库。在本文中,我们将分析处理日期和时间的主要方法,提供实用示例,并展示如何避免常见错误。



1. 经典方法:<ctime>库



<ctime>库是从C语言继承到C++的。它提供了简单但功能有限的工具来处理日历时间。主要类型包括:std::time_t(自1970年1月1日以来的整数秒数)和std::tm(包含年、月、日、时、分、秒等字段的结构体)。



示例1:获取当前时间并格式化



#include <iostream>#include <ctime>

int main() { // 获取当前时间 std::time_t now = std::time(nullptr); // 转换为本地时间 std::tm* local = std::localtime(&now); // 以"YYYY-MM-DD HH:MM:SS"格式输出 char buffer[80]; std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local); std::cout << "Current time: " << buffer << std::endl; return 0;}


<ctime>主要函数:

  • std::time() — 返回当前日历时间。
  • std::localtime() — 将time_t转换为表示本地时间的tm结构体。
  • std::gmtime() — 同上,但针对UTC(协调世界时)。
  • std::mktime() — 反向转换:从tm到time_t。
  • std::difftime() — 计算两个时间点之间的秒数差。
  • std::strftime() — 根据给定模板将日期和时间格式化为字符串。


缺点:该库不处理时区(除了本地时间和UTC),不支持高精度(仅秒级),并且tm结构体不是类型安全的(例如,年份从1900开始计数,月份从0到11)。



2. 现代标准:<chrono>库(C++11及更新版本)



从C++11开始,标准库中加入了<chrono>库——这是一个类型安全且高精度的用于处理时间的库。它围绕三个主要概念运作:时长、时间点和时钟。



时钟类型:

  • std::chrono::system_clock — 系统时间,与日历相关(可转换为time_t)。
  • std::chrono::steady_clock — 单调时钟,适合测量时间间隔(不受调整影响)。
  • std::chrono::high_resolution_clock — 具有最高可用分辨率的时钟(通常是steady_clock的同义词)。


示例2:测量操作执行时间



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

int main() { // 记录开始时间 auto start = std::chrono::steady_clock::now(); // 模拟工作 std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 记录结束时间 auto end = std::chrono::steady_clock::now(); // 计算时间差 auto duration = end - start;

博客

书籍推荐