C 获取当前时间

在 C 语言中,我们可以使用 <time.h> 标准库来获取当前时间,需要执行以下 3 步。

  1. 使用 time() 函数获取 “当前时间的时间戳”。
  2. 使用 localtime() 函数将 “当前时间戳” 转换为 “本地时间结构体”。
  3. 使用 strftime() 函数将 “本地时间结构体” 格式化为 “字符串”。

示例 1:C 获取日期和时间

下面例子使用 C <time.h> 标准库来获取当前时间的 “年、月、日、时、分、秒”。

#include <stdio.h>
#include <time.h>

int main(void)
{
    struct tm* p;                      // 声明一个结构体指针
    time_t stamp = time(NULL);         // 获取当前时间戳
    p = localtime(&stamp);             // 将时间戳转换为本地时间

    int year = p->tm_year + 1900;      // 年
    int month = p->tm_mon + 1;         // 月
    int day = p->tm_mday;              // 日
    int hour = p->tm_hour;             // 时
    int minute = p->tm_min;            // 分
    int second = p->tm_sec;            // 秒

    printf("年:%d\n", year);
    printf("月:%d\n", month);
    printf("日:%d\n", day);
    printf("时:%d\n", hour);
    printf("分:%d\n", minute);
    printf("秒:%d\n", second);

    return 0;
}

运行结果如下。

年:2025
月:5
日:20
时:13
分:14
秒:30

分析:

struct tm* p;                   // 声明一个结构体指针
time_t stamp = time(NULL);      // 获取当前时间戳
p = localtime(&stamp);          // 将时间戳转换为本地时间

tm 是 <time.h> 提供的一种结构体类型,time_t 是 <time.h> 提供的一种数据类型,而 time() 和 localtime() 是 <time.h> 提供的两个函数。

tm 这个结构体有很多成员,我们可以通过这些成员来获取年、月、日、时、分、秒。其中,常用的成员如下表所示。

tm 结构体的成员
成员 说明
tm_year 获取自 1900 年以来的年数
tm_mon 获取月份,取值为 0(一月)到 11(十二月)之间的整数
tm_mday 获取日数,取值为 1 ~ 31 之间的整数
tm_hour 获取小时数,取值为 0 ~ 23 之间的整数
tm_min 获取分钟数,取值为 0 ~ 59 之间的整数
tm_sec 获取秒数,取值为 0 ~ 59 之间的整数

p 是一个结构体指针,如果想要获取成员的值,必须使用 “->” 运算符,而不能使用点运算符(.)。对于这些语法,我们在 “C 结构体指针” 一节中已经详细介绍过了。

需要注意的是,年份是从 1900 算起的,因此要加上 1900。然后月份的取值是 0 ~ 11,因此要加上 1 才正确。

int year = p->tm_year + 1900;      // 年
int month = p->tm_mon + 1;         // 月

示例 2:C 格式化日期时间

下面例子将进一步对日期时间进行格式化,以获取预期的当前时间格式。

#include <stdio.h>
#include <time.h>

int main(void)
{
    struct tm* p;                      // 声明一个结构体指针
    time_t stamp = time(NULL);         // 获取当前时间戳
    p = localtime(&stamp);             // 将时间戳转换为本地时间

    int year = p->tm_year + 1900;      // 年
    int month = p->tm_mon + 1;         // 月
    int day = p->tm_mday;              // 日
    int hour = p->tm_hour;             // 时
    int minute = p->tm_min;            // 分
    int second = p->tm_sec;            // 秒

    printf("%02d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second);
    return 0;
}

运行结果如下。

2025-05-20 13:14:30

示例 3:使用 strftime() 格式化时间

在 C 语言中,手动拼接字符串(如示例 2)虽然可行,但比较麻烦,而且我们还需要手动处理 “补 0” 等问题。实际上,C 语言提供了一个专门用于格式化时间的函数 strftime(),它功能非常强大且使用简单。

#include <stdio.h>
#include <time.h>

int main(void)
{
    struct tm* p;
    time_t stamp = time(NULL);
    
    // 将时间戳转换为本地时间
    p = localtime(&stamp);
    
    // 定义一个字符数组,用于存储格式化后的字符串
    char str[80];
    
    // 使用 strftime 进行格式化
    // 格式:年-月-日 时:分:秒
    strftime(str, 80, "%Y-%m-%d %H:%M:%S", p);
    
    printf("当前时间:%s", str);
    
    return 0;
}

运行结果如下。

当前时间:2025-05-20 13:14:30

分析:

在这个例子中,我们使用了 strftime() 函数来格式化时间。它的用法非常类似于 printf(),但它是将格式化后的结果存储到一个字符数组中。

strftime(str, 80, "%Y-%m-%d %H:%M:%S", p); 这句代码的意思是:根据 "%Y-%m-%d %H:%M:%S" 这个格式,将结构体 p 中的时间信息格式化,并将结果存储到 str 数组中(最大不超过 80 个字符)。

使用 strftime() 最大的好处是,我们不需要再手动去 “+1900” 或者 “+1” 了,也不需要手动判断是否需要补 0(比如自动将 5 月显示为 05),函数内部会自动帮我们处理好。常用的格式化占位符如下表所示。

strftime() 格式化占位符
占位符 说明 示例
%Y 年份(4 位数字) 2025
%m 月份(01-12) 05
%d 日期(01-31) 20
%H 小时(00-23,24 小时制) 13
%M 分钟(00-59) 14
%S 秒数(00-59) 30

上一篇: C 获取时间戳

下一篇: C 延时函数

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号