C语言时间编程完全指南

时间处理是 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 时钟,它不受系统时间调整影响,更适合测量时间间隔。