在 C 语言中,我们可以使用 <time.h> 标准库来获取当前时间,需要执行以下 3 步。
- 使用 time() 函数获取 “当前时间的时间戳”。
- 使用 localtime() 函数将 “当前时间戳” 转换为 “本地时间结构体”。
- 使用 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_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),函数内部会自动帮我们处理好。常用的格式化占位符如下表所示。
| 占位符 | 说明 | 示例 |
|---|---|---|
| %Y | 年份(4 位数字) | 2025 |
| %m | 月份(01-12) | 05 |
| %d | 日期(01-31) | 20 |
| %H | 小时(00-23,24 小时制) | 13 |
| %M | 分钟(00-59) | 14 |
| %S | 秒数(00-59) | 30 |
