[C++] 时间处理库函数 | `tm`、`mktime` 和 `localtime`

在编程中,处理日期和时间是一个常见的需求

C++ 提供了一些强大的库函数来帮助我们完成这些任务。本文将通过一个简单的代码示例,介绍 tm 结构体、mktime 和 localtime 这三个关键函数的作用和用法。

代码

调用库函数code

cpp 复制代码
class Solution {
    const string weekdays[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
public:
    string dayOfTheWeek(int day, int month, int year) {
        tm dt = {0, 0, 0, day, month - 1, year - 1900};//struct
        time_t t = mktime(&dt);//tm turn timestamp
        return weekdays[localtime(&t)->tm_wday];//timestamp turn local
        //catch wday
    }
};

解释

1. tm 结构体

tm 是 C/C++ 中用于表示日期和时间的一个结构体,定义在 <ctime> 头文件中。它的成员如下:

cpp 复制代码
struct tm {
    int tm_sec;   // 秒(0-59)
    int tm_min;   // 分(0-59)
    int tm_hour;  // 时(0-23)
    int tm_mday;  // 日(1-31)
    int tm_mon;   // 月(0-11,0 表示一月)
    int tm_year;  // 年(从 1900 年开始的偏移量,例如 2023 年为 123)
    int tm_wday;  // 星期几(0-6,0 表示周日)
    int tm_yday;  // 一年中的第几天(0-365)
    int tm_isdst; // 夏令时标志(正数表示启用,0 表示不启用,负数表示未知)
};

在代码中,我们初始化了一个 tm 结构体 dt:

cpp 复制代码
tm dt = {0, 0, 0, day, month - 1, year - 1900};
  • tm_mon 设置为 month - 1,因为月份是从 0 开始计数的。
  • tm_year 设置为 year - 1900,因为年份是从 1900 年开始的偏移量。

2. mktime 函数

mktime 函数的作用是将一个 tm 结构体转换为 time_t 类型的时间值(通常是从 1970 年 1 月 1 日开始的秒数)。它的原型如下:

cpp 复制代码
time_t mktime(struct tm* timeptr);

在代码中,我们调用:

cpp 复制代码
time_t t = mktime(&dt);

mktime 会修正 tm 结构体中的不合理值(例如,如果 tm_mday 超过了该月的天数,它会自动调整月份和年份),并返回一个 time_t 类型的时间戳。


3. localtime 函数

localtime 函数的作用是将 time_t 类型的时间戳转换为本地时间的 tm 结构体。它的原型如下:

cpp 复制代码
struct tm* localtime(const time_t* timer);

在代码中,我们调用:

cpp 复制代码
localtime(&t)->tm_wday

localtime(&t) 返回一个指向 tm 结构体的指针,其中的 tm_wday 成员表示星期几(0 表示周日,1 表示周一,依此类推)。我们通过这个值从 weekdays 数组中获取对应的星期名称。


总结

  • tm 结构体:用于表示日期和时间的各个组成部分。
  • mktime :将 tm 结构体转换为 time_t 时间戳,并自动修正不合理的日期值。
  • localtime :将 time_t 时间戳转换为本地时间的 tm 结构体。
相关推荐
C^h7 小时前
c++ string
开发语言·c++
raindayinrain7 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的7 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao7 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的8 小时前
C 局部静态变量
c语言·开发语言·网络安全
小徐不徐说8 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的9 小时前
C++第一节课
开发语言·c++
UIU1149 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”9 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
小王C语言9 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt