Linux C语言时间如何获取与处理?

99ANYc3cd6
预计阅读时长 27 分钟
位置: 首页 C语言 正文
  1. 获取当前时间:获取日历时间(从纪元开始的秒数)或分解的本地时间/UTC时间。
  2. 时间格式化:将时间结构体或秒数格式化为人类可读的字符串。
  3. 时间解析:将字符串格式的时间解析回时间结构体。
  4. 高精度时间:用于性能测量、计算时间差等需要纳秒或微秒级精度的场景。
  5. 程序执行时间:测量一段代码的运行时间。
  6. 休眠(延迟):让程序暂停执行指定的时长。

下面我将详细介绍这些方面,并提供代码示例。

linux c语言时间
(图片来源网络,侵删)

核心头文件

在进行时间操作之前,你需要包含以下头文件:

#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;
}

注意:

linux c语言时间
(图片来源网络,侵删)
  • 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;
}

常用格式说明符:

linux c语言时间
(图片来源网络,侵删)
  • %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 程序中灵活地处理几乎所有与时间相关的任务了。

-- 展开阅读全文 --
头像
织梦5.7手机插件如何安装使用?
« 上一篇 04-04
dede管理员账号密码忘了怎么找回?
下一篇 » 04-04

相关文章

取消
微信二维码
支付宝二维码

目录[+]