C语言中如何实现日期格式化?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 C语言 正文

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

c语言dateformat
(图片来源网络,侵删)

使用 C 标准库 (<time.h>)

这是最基础、最通用的方法,因为它不依赖于任何操作系统或第三方库,核心是 struct tmstrftime() 函数。

核心概念

  • time_t: 一个表示时间的算术类型(通常是 longlong long),它表示从某个固定时间点(称为“纪元”,Epoch,通常是 1970-01-01 00:00:00 UTC)开始的秒数。
  • struct tm: 一个结构体,用于分解时间,包含年、月、日、时、分、秒等成员,它有两种模式:
    • UTC (GMT) 模式: tm_isdst 标志为 0。
    • 本地时间模式: tm_isdst 标志为非 0(通常为 1 表示夏令时,-1 表示信息未知)。
  • 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++ 接口。

c语言dateformat
(图片来源网络,侵删)

注意: 这个库通常以头文件库的形式提供,你只需要下载 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 通常更强大且与系统集成更好。

c语言dateformat
(图片来源网络,侵删)

Windows API (<windows.h>)

Windows 提供了 GetDateFormatExGetTimeFormatEx 函数,可以非常灵活地格式化日期和时间。

#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 桌面应用、需要利用特定平台特性的项目

给你的建议:

  1. 如果你只是想在 C 语言中进行简单的日期格式化,比如把 time_t 变成 "YYYY-MM-DD" 这样的字符串,请直接使用方法一 (<time.h>strftime),这是最标准、最通用的做法。
  2. 如果你的项目非常复杂,需要频繁进行日期计算、处理不同时区,并且不介意使用 C++,强烈推荐方法三 (date.h),它会让你事半功倍。
  3. 如果你的代码只在 Windows 上运行,并且希望获得与 Windows 系统设置(如语言、区域格式)完全一致的显示效果,可以考虑使用方法二的 Windows API,但对于大多数后端程序,标准库已经足够。
-- 展开阅读全文 --
头像
dede如何自动获取关键词?
« 上一篇 03-02
dede一键更新 自动
下一篇 » 03-02

相关文章

取消
微信二维码
支付宝二维码

目录[+]