下面我将详细介绍这几种方法,并提供代码示例。

(图片来源网络,侵删)
使用 C 标准库 (<time.h>)
这是最基础、最通用的方法,因为它不依赖于任何操作系统或第三方库,核心是 struct tm 和 strftime() 函数。
核心概念
time_t: 一个表示时间的算术类型(通常是long或long long),它表示从某个固定时间点(称为“纪元”,Epoch,通常是 1970-01-01 00:00:00 UTC)开始的秒数。struct tm: 一个结构体,用于分解时间,包含年、月、日、时、分、秒等成员,它有两种模式:- UTC (GMT) 模式:
tm_isdst标志为 0。 - 本地时间模式:
tm_isdst标志为非 0(通常为 1 表示夏令时,-1 表示信息未知)。
- UTC (GMT) 模式:
mktime(): 将struct tm(本地时间)转换回time_t。localtime(): 将time_t转换为本地时间的struct tm。gmtime(): 将time_t转换为 UTC 时间的struct tm。strftime(): 这是格式化的关键函数,它根据你提供的格式字符串,将struct tm中的时间信息格式化成一个字符串。
strftime() 格式说明符
strftime() 的格式化字符与 Unix/Linux 中的 date 命令类似:
| 格式符 | 说明 | 示例 (2025-10-27 15:30:45) |
|---|---|---|
%Y |
4位数年份 | 2025 |
%y |
2位数年份 (00-99) | 23 |
%m |
2位数月份 (01-12) | 10 |
%b |
月份缩写 (Jan, Feb, ...) | Oct |
%B |
月份全称 (January, February, ...) | October |
%d |
2位数日期 (01-31) | 27 |
%e |
1或2位数日期 (1-31) | 27 |
%a |
星期几缩写 (Sun, Mon, ...) | Fri |
%A |
星期几全称 (Sunday, Monday, ...) | Friday |
%H |
24小时制小时 (00-23) | 15 |
%I |
12小时制小时 (01-12) | 03 |
%M |
分钟 (00-59) | 30 |
%S |
秒 (00-60) | 45 |
%p |
AM 或 PM | PM |
%c |
标准日期时间表示 (如 "Fri Oct 27 15:30:45 2025") | Fri Oct 27 15:30:45 2025 |
%x |
标准日期表示 (如 "10/27/23") | 10/27/23 |
%X |
标准时间表示 (如 "15:30:45") | 15:30:45 |
| 输出一个百分号 |
代码示例
#include <stdio.h>
#include <time.h> // 必须包含的头文件
int main() {
// 1. 获取当前时间的 time_t 值
time_t raw_time;
time(&raw_time);
// 2. 将 time_t 转换为本地时间的 struct tm
struct tm *time_info = localtime(&raw_time);
// 3. 定义一个字符数组来存储格式化后的日期字符串
// 空间要足够大,"YYYY-MM-DD HH:MM:SS" 需要 19 个字符,加上结尾的 '\0',至少 20。
char buffer[80];
// 4. 使用 strftime 进行格式化
// 格式: "YYYY年MM月DD日 HH:MM:SS"
strftime(buffer, sizeof(buffer), "%Y年%m月%d日 %H:%M:%S", time_info);
printf("格式化1 (中文): %s\n", buffer);
// 格式: "MM/DD/YYYY"
strftime(buffer, sizeof(buffer), "%m/%d/%Y", time_info);
printf("格式化2 (美式): %s\n", buffer);
// 格式: "Day, Month DD, YYYY"
strftime(buffer, sizeof(buffer), "%a, %B %d, %Y", time_info);
printf("格式化3 (详细): %s\n", buffer);
return 0;
}
可能的输出:
格式化1 (中文): 2025年10月27日 15:30:45
格式化2 (美式): 10/27/2025
格式化3 (详细): Fri, October 27, 2025
使用第三方库 (如 date.h)
对于更复杂的日期操作(如日期加减、时区处理、解析任意格式字符串),标准库就显得力不从心了,这时,一个现代的第三方库是更好的选择,一个非常优秀的选择是 Howard Hinnant 的 C++ 日期库,它有一个纯 C 的版本叫 cdate 或者直接使用其 C++ 接口。

(图片来源网络,侵删)
注意: 这个库通常以头文件库的形式提供,你只需要下载 date.h 并包含它即可。
优点
- 功能强大: 支持历法转换、日期运算、时区等。
- 易用: 提供了比
struct tm更直观的 API。 - 安全: 避免了
struct tm的一些陷阱(如月份从0开始)。
代码示例 (使用 date.h)
你需要获取 date.h 库,可以从它的 GitHub 仓库下载。
// 需要先下载 date.h 并放在同一目录下,或指定正确的路径
#include "date.h"
#include <stdio.h>
int main() {
// 获取当前系统时钟的时间点
using namespace date;
using namespace std::chrono;
// 获取当前时间点
auto now = system_clock::now();
// 将时间点转换为 "YYYY-MM-DD" 格式的字符串
// 这比 strftime 更直观
std::string s = format("%F", now); // %F 是 %Y-%m-%d 的简写
printf("格式化1 (ISO 8601): %s\n", s.c_str());
// 自定义格式
s = format("%Y年/%m月/%d日 %H时:%M分", now);
printf("格式化2 (自定义): %s\n", s.c_str());
// 日期运算示例
auto tomorrow = now + days(1);
s = format("明天的日期是: %Y-%m-%d", tomorrow);
printf("%s\n", s.c_str());
return 0;
}
编译说明:
你需要使用支持 C++11 或更高标准的编译器来编译这个代码,因为它使用了 C++ 的 <chrono> 库。
g++ -std=c++11 your_file.cpp -o your_program
使用操作系统 API
如果你只关心在特定操作系统(如 Windows 或 Linux)上运行,可以使用它们提供的原生 API,这些 API 通常更强大且与系统集成更好。

(图片来源网络,侵删)
Windows API (<windows.h>)
Windows 提供了 GetDateFormatEx 和 GetTimeFormatEx 函数,可以非常灵活地格式化日期和时间。
#include <windows.h>
#include <stdio.h>
int main() {
// 获取当前系统时间
SYSTEMTIME st;
GetLocalTime(&st); // 使用 GetSystemTime(&st) 获取UTC时间
// 定义缓冲区
WCHAR dateStr[256];
WCHAR timeStr[256];
// 格式化日期
// LOCALE_USER_DEFAULT 使用用户默认的区域设置
// "yyyy'年'M'月'd'日'" 是自定义格式
GetDateFormatEx(
LOCALE_USER_DEFAULT,
0, // 默认格式
&st,
L"yyyy'年'M'月'd'日'", // 自定义格式字符串
dateStr,
sizeof(dateStr) / sizeof(WCHAR),
NULL
);
// 格式化时间
GetTimeFormatEx(
LOCALE_USER_DEFAULT,
0, // 默认格式
&st,
L"HH'时'mm'分'ss'秒'", // 自定义格式字符串
timeStr,
sizeof(timeStr) / sizeof(WCHAR),
NULL
);
// 注意:WCHAR 是宽字符,printf 需要使用 %S
wprintf(L"格式化日期: %S\n", dateStr);
wprintf(L"格式化时间: %S\n", timeStr);
return 0;
}
Linux/POSIX API (<strftime> 再次登场)
在 Linux 上,方法一 (<time.h> 和 strftime) 就是标准的 POSIX 方法,它已经非常完善和强大了,在 Linux 环境下,你通常不需要其他方法。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
C 标准库 <time.h> |
跨平台、无需额外依赖、轻量级 | 功能有限、处理复杂逻辑(如时区、日期运算)繁琐 | 简单的日期格式化、学习 C 语言基础、嵌入式开发 |
第三方库 date.h |
功能极其强大、API 现代、安全、易用 | 需要 C++11 支持、需要下载和集成库 | 复杂的日期时间应用、金融系统、需要跨时区处理的软件 |
| 操作系统 API | 与系统集成度高、功能丰富(如 Windows) | 不跨平台、代码可移植性差 | Windows 桌面应用、需要利用特定平台特性的项目 |
给你的建议:
- 如果你只是想在 C 语言中进行简单的日期格式化,比如把
time_t变成 "YYYY-MM-DD" 这样的字符串,请直接使用方法一 (<time.h>和strftime),这是最标准、最通用的做法。 - 如果你的项目非常复杂,需要频繁进行日期计算、处理不同时区,并且不介意使用 C++,强烈推荐方法三 (
date.h),它会让你事半功倍。 - 如果你的代码只在 Windows 上运行,并且希望获得与 Windows 系统设置(如语言、区域格式)完全一致的显示效果,可以考虑使用方法二的 Windows API,但对于大多数后端程序,标准库已经足够。
