- 获取当前时间:获取日历时间(从纪元开始的秒数)或分解的本地时间/UTC时间。
- 时间格式化:将时间结构体或秒数格式化为人类可读的字符串。
- 时间解析:将字符串格式的时间解析回时间结构体。
- 高精度时间:用于性能测量、计算时间差等需要纳秒或微秒级精度的场景。
- 程序执行时间:测量一段代码的运行时间。
- 休眠(延迟):让程序暂停执行指定的时长。
下面我将详细介绍这些方面,并提供代码示例。

核心头文件
在进行时间操作之前,你需要包含以下头文件:
#include <time.h> // 标准时间函数 (time, ctime, localtime, strftime 等) #include <stdio.h> // 用于 printf #include <unistd.h> // 用于 sleep (秒级休眠) 和 nanosleep (纳秒级休眠)
获取当前时间
a) time() 函数 - 获取日历时间
time() 函数返回从 纪元 (Epoch, 通常是 1970-01-01 00:00:00 UTC) 到现在的秒数(一个 time_t 类型的值)。
#include <time.h>
#include <stdio.h>
int main() {
time_t raw_time;
time(&raw_time); // 获取当前时间,并存入 raw_time
printf("Raw time (seconds since epoch): %ld\n", raw_time);
// 也可以这样写:
// time_t raw_time2 = time(NULL);
// printf("Raw time (seconds since epoch): %ld\n", raw_time2);
return 0;
}
b) localtime() 和 gmtime() - 转换为分解时间
time_t 格式不方便阅读,通常需要将其转换为 struct tm 结构体,该结构体包含了年、月、日、时、分、秒等信息。
localtime(): 将time_t转换为 本地时间 (考虑时区)。gmtime(): 将time_t转换为 UTC (格林威治标准时间)。
#include <time.h>
#include <stdio.h>
int main() {
time_t raw_time;
struct tm *time_info;
time(&raw_time);
time_info = localtime(&raw_time); // 转换为本地时间结构体
printf("Local time: Year=%d, Month=%d, Day=%d, Hour=%d, Min=%d, Sec=%d\n",
time_info->tm_year + 1900, // tm_year 从 1900 开始
time_info->tm_mon + 1, // tm_mon 从 0 开始 (0-11)
time_info->tm_mday,
time_info->tm_hour,
time_info->tm_min,
time_info->tm_sec);
time_info = gmtime(&raw_time); // 转换为UTC时间结构体
printf("UTC time: Year=%d, Month=%d, Day=%d, Hour=%d, Min=%d, Sec=%d\n",
time_info->tm_year + 1900,
time_info->tm_mon + 1,
time_info->tm_mday,
time_info->tm_hour,
time_info->tm_min,
time_info->tm_sec);
return 0;
}
注意:

struct tm的成员是从tm_year开始计算的,需要手动调整。localtime()和gmtime()返回的指针指向一个静态分配的内存区域,这意味着每次调用这两个函数都会覆盖上一次的结果,如果你需要同时保存多个时间结构体,必须自己进行拷贝。
时间格式化
a) asctime() - 简单格式化
asctime() 将 struct tm 结构体转换为一个固定的字符串格式,Wed Jun 30 21:49:08 1993\n。
#include <time.h>
#include <stdio.h>
int main() {
time_t raw_time;
struct tm *time_info;
char *time_str;
time(&raw_time);
time_info = localtime(&raw_time);
time_str = asctime(time_info);
printf("Formatted time: %s", time_str);
return 0;
}
b) ctime() - 从 time_t 格式化
ctime() 是 asctime() 的便捷版本,它直接接受一个 time_t 指针,并返回格式化好的字符串。
#include <time.h>
#include <stdio.h>
int main() {
time_t raw_time;
time(&raw_time);
char *time_str = ctime(&raw_time);
printf("Formatted time from time_t: %s", time_str);
return 0;
}
c) strftime() - 自定义格式化 (最常用)
strftime() 是功能最强大的格式化函数,它允许你使用类似 printf 的格式说明符来定义输出字符串的格式。
#include <time.h>
#include <stdio.h>
int main() {
time_t raw_time;
struct tm *time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
// 格式化字符串: YYYY-MM-DD HH:MM:SS
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", time_info);
printf("Custom formatted time: %s\n", buffer);
// 格式化字符串: Today is Tuesday, 14 July 2025.
strftime(buffer, sizeof(buffer), "Today is %A, %d %B %Y.", time_info);
printf("Another format: %s\n", buffer);
return 0;
}
常用格式说明符:

%Y: 4位数年份 (e.g., 2025)%m: 2位数月份 (01-12)%d: 2位数日期 (01-31)%H: 24小时制小时 (00-23)%I: 12小时制小时 (01-12)%M: 分钟 (00-59)%S: 秒 (00-60, 60用于闰秒)%F:%Y-%m-%d的简写%T:%H:%M:%S的简写%A: 星期全名 (e.g., Monday)%B: 月份全名 (e.g., January)%p: AM 或 PM
时间解析
strptime() 函数是 strftime() 的反向操作,它将一个字符串按照指定的格式解析成一个 struct tm 结构体。
#include <time.h>
#include <stdio.h>
int main() {
const char *time_str = "2025-10-27 15:30:00";
struct tm tm_info = {0}; // 必须初始化为0
char buffer[80];
// 解析字符串到tm_info结构体
if (strptime(time_str, "%Y-%m-%d %H:%M:%S", &tm_info) == NULL) {
printf("Parsing failed.\n");
return 1;
}
// 为了验证,我们再将tm_info格式化输出
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tm_info);
printf("Parsed and re-formatted time: %s\n", buffer);
return 0;
}
注意: strptime() 不会设置 tm_wday (星期几) 和 tm_yday (一年中的第几天),你需要用 mktime() 来填充这些字段。
高精度时间
对于需要微秒或纳秒级精度的场景,可以使用 <time.h> 中的 clock_gettime()。
#include <time.h>
#include <stdio.h>
int main() {
struct timespec ts;
// 获取当前时间,精确到纳秒
// CLOCK_REALTIME: 系统的实时时钟,可以被修改
// CLOCK_MONOTONIC: 从系统启动开始计时,不受系统时间修改影响,更适合测量耗时
clock_gettime(CLOCK_MONOTONIC, &ts);
time_t seconds = ts.tv_sec; // 秒
long nanoseconds = ts.tv_nsec; // 纳秒
printf("High-precision time: %ld seconds, %ld nanoseconds\n", seconds, nanoseconds);
return 0;
}
程序执行时间
a) clock() 函数
clock() 返回程序自启动以来占用的 CPU 时间(时钟滴答数),你需要用 CLOCKS_PER_SEC 来将其转换为秒。
#include <time.h>
#include <stdio.h>
int main() {
clock_t start, end;
double cpu_time_used;
start = clock();
// 模拟一段耗时操作
for (int i = 0; i < 100000000; i++) {
// do nothing
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("CPU time used: %f seconds\n", cpu_time_used);
return 0;
}
b) clock_gettime() 函数 (更推荐)
使用 CLOCK_MONOTONIC 来测量时间差是更可靠的方法,因为它不受系统时间更改的影响。
#include <time.h>
#include <stdio.h>
int main() {
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
// 模拟一段耗时操作
for (int i = 0; i < 100000000; i++) {
// do nothing
}
clock_gettime(CLOCK_MONOTONIC, &end);
double elapsed_time = (end.tv_sec - start.tv_sec) +
(end.tv_nsec - start.tv_nsec) / 1e9;
printf("Elapsed time: %f seconds\n", elapsed_time);
return 0;
}
休眠(延迟)
a) sleep() - 秒级休眠
#include <unistd.h>
#include <stdio.h>
int main() {
printf("Sleeping for 2 seconds...\n");
sleep(2); // 休眠2秒
printf("Awake!\n");
return 0;
}
b) nanosleep() - 纳秒级休眠
nanosleep() 提供了更高精度的休眠,并且比 sleep() 更不容易被信号中断。
#include <time.h>
#include <stdio.h>
int main() {
struct timespec req, rem;
req.tv_sec = 1; // 1秒
req.tv_nsec = 500000000; // 500,000,000 纳秒 = 0.5秒
printf("Sleeping for 1.5 seconds...\n");
// nanosleep 在被信号中断时会返回-1,并将剩余时间存入 rem
// 需要循环调用以完成全部休眠
while (nanosleep(&req, &rem) == -1) {
// 如果被中断,用剩余时间继续休眠
req = rem;
}
printf("Awake!\n");
return 0;
}
| 任务 | 推荐函数 | 说明 |
|---|---|---|
| 获取当前时间 | time() |
返回 time_t (秒数) |
| 转换为结构体 | localtime() / gmtime() |
转换为 struct tm,注意静态内存问题 |
| 简单格式化 | asctime() / ctime() |
快速但格式固定 |
| 自定义格式化 | strftime() |
最常用,格式灵活 |
| 时间解析 | strptime() |
strftime 的反向操作 |
| 高精度时间 | clock_gettime() |
获取纳秒级时间,推荐用于测量耗时 |
| 测量耗时 | clock_gettime(CLOCK_MONOTONIC) |
最推荐,不受系统时间影响 |
| 秒级休眠 | sleep() |
简单易用 |
| 纳秒级休眠 | nanosleep() |
高精度,比 sleep 更健壮 |
掌握这些函数,你就可以在 Linux C 程序中灵活地处理几乎所有与时间相关的任务了。
