时间处理是 C 语言编程中的重要课题。本文将详细介绍 time.h 库的各种时间函数,从基础时间获取到高精度计时,帮助你掌握时间处理技能。
时间基础概念
在 C 语言中,时间主要分为以下几种类型:
- 日历时间 - 从 1970-01-01 00:00:00 开始的秒数(Unix 时间戳)
- 分解时间 - 年、月、日、时、分、秒等单独表示
- CPU 时间 - 程序消耗的处理器时间
获取当前时间
使用 time() 函数获取当前日历时间:
time_basic.c
#include#include int main(void) { /* 获取当前时间戳 */ time_t now = time(NULL); printf("当前时间戳: %ld\n", (long)now); /* 转换为本地时间 */ struct tm *local = localtime(&now); printf("本地时间: %04d-%02d-%02d %02d:%02d:%02d\n", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); return 0; }
时间格式化
使用 strftime() 函数自定义时间输出格式:
time_format.c
#include#include int main(void) { time_t now = time(NULL); struct tm *tm_now = localtime(&now); char buf[64]; /* 各种格式化格式 */ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_now); printf("标准格式: %s\n", buf); strftime(buf, sizeof(buf), "%F %T", tm_now); /* 同上 */ printf("简洁格式: %s\n", buf); strftime(buf, sizeof(buf), "%c", tm_now); /* 本地格式 */ printf("本地格式: %s\n", buf); strftime(buf, sizeof(buf), "%A, %B %d, %Y", tm_now); printf("英文格式: %s\n", buf); return 0; }
高精度计时 clock_gettime
对于需要高精度计时的场景,使用 clock_gettime() 函数:
high_precision.c
#include#include double get_time_diff(struct timespec *start, struct timespec *end) { return (end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec) / 1e9; } int main(void) { struct timespec start, end; /* CLOCK_MONOTONIC: 单调时钟,不受系统时间调整影响 */ clock_gettime(CLOCK_MONOTONIC, &start); /* 模拟一些计算 */ double sum = 0; for (int i = 0; i 1000000; i++) { sum += i * 0.000001; } clock_gettime(CLOCK_MONOTONIC, &end); printf("耗时: %.6f 秒\n", get_time_diff(&start, &end)); printf("sum = %.6f\n", sum); /* CLOCK_REALTIME: 系统实时时钟,可被调整 */ clock_gettime(CLOCK_REALTIME, &start); printf("系统时间: %ld.%09ld\n", start.tv_sec, start.tv_nsec); return 0; }
定时器实现
使用 alarm() 和 setitimer() 实现定时功能:
timer.c
#include#include #include #include void handler(int sig) { static int count = 0; printf("定时触发! (%d)\n", ++count); } int main(void) { /* 设置信号处理函数 */ signal(SIGALRM, handler); /* 3秒后触发一次性 alarm */ alarm(3); pause(); return 0; }
时间计算示例
计算两个时间点之间的差值:
time_diff.c
#include#include int main(void) { /* 2026-01-01 00:00:00 */ struct tm t1 = {0}; t1.tm_year = 126; /* 2026 - 1900 */ t1.tm_mon = 0; t1.tm_mday = 1; /* 2026-12-31 23:59:59 */ struct tm t2 = {0}; t2.tm_year = 126; t2.tm_mon = 11; t2.tm_mday = 31; t2.tm_hour = 23; t2.tm_min = 59; t2.tm_sec = 59; time_t time1 = mktime(&t1); time_t time2 = mktime(&t2); double diff_days = difftime(time2, time1) / (24 * 60 * 60); printf("两年之间相差: %.0f 天\n", diff_days); return 0; }
常用时间函数速查
- time() - 获取当前时间戳
- localtime() - 转换为本地分解时间
- gmtime() - 转换为 UTC 分解时间
- strftime() - 自定义格式输出
- clock_gettime() - 高精度计时
- mktime() - 分解时间转时间戳
- difftime() - 计算时间差
- sleep() - 秒级睡眠
- nanosleep() - 纳秒级睡眠
总结
掌握时间编程对于日志记录、性能测试、定时任务等场景非常重要。对于高精度需求,优先使用 clock_gettime() 的 CLOCK_MONOTONIC 时钟,它不受系统时间调整影响,更适合测量时间间隔。