一、Linux 获取时间的常用函数(按精度从低到高)
1. time()
-
精度:秒(1s)
-
返回值:从 1970-01-01 00:00 到当前的秒数(time_t 类型)
-
应用场景:无需高精度需求,如获取时间戳、日志时间、文件时间戳
示例代码:
cpp
#include <time.h>
time_t now = time(NULL);
2. gettimeofday()
-
精度:微秒(1μs = 10⁻⁶s)
-
返回值:秒(tv_sec) + 微秒(tv_usec),对应 struct timeval 结构体
-
应用场景:性能计时、网络时间等大多数高精度计时场景,是 Linux 中最常用的时间函数
示例代码:
cpp
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv, NULL);
3. clock_gettime()
-
精度:纳秒(1ns = 10⁻⁹s)
-
特性:Linux 高精度标准接口(POSIX 标准),支持多种时钟类型
-
常用时钟类型:
-
CLOCK_REALTIME:真实时间(可被系统修改)
-
CLOCK_MONOTONIC:单调递增时间(不会回退,最适合计时场景)
-
-
应用场景:高精度计时、性能分析、音视频开发、驱动开发等
示例代码:
cpp
#include <time.h>
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
4. localtime() / gmtime()
-
功能:将 time_t 类型的时间戳转换为年月日时分秒格式(struct tm 结构体)
-
区别:
-
localtime():转换为本地时区的时间
-
gmtime():转换为 UTC 0 时区的时间
-
示例代码:
cpp
struct tm* t = localtime(&now); // now 为 time_t 类型变量
二、时间函数精度对比表
| 函数 | 精度 | 对应数据类型 |
|---|---|---|
| time() | 秒 | time_t |
| gettimeofday() | 微秒 | struct timeval |
| clock_gettime() | 纳秒 | struct timespec |
三、时间格式化:sprintf 与 sscanf 用法
1. sprintf:时间 → 字符串(格式化输出)
功能:将 struct tm 类型的时间数据,格式化为指定格式的字符串,存入字符数组缓冲区。
cpp
#include <stdio.h>
#include <time.h>
int main() {
time_t now = time(NULL);
struct tm* t = localtime(&now);
char buf[64]; // 格式化格式:年-月-日 时:分:秒(注意 tm 结构体的取值偏移)
sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d",
t->tm_year + 1900, // tm_year 从 1900 年开始计数,需加 1900
t->tm_mon + 1, // tm_mon 取值 0~11,需加 1
t->tm_mday,
t->tm_hour,
t->tm_min,
t->tm_sec);
printf("%s\n", buf);
return 0;
}
2. sscanf:字符串 → 时间(解析输入)
功能:从指定格式的字符串中,解析出年、月、日、时、分、秒等时间数据,存入对应变量。
cpp
#include <stdio.h>
int main() {
char str[] = "2026-04-04 15:30:25";
int y, m, d, h, min, s; // 按字符串格式解析,对应存入变量
sscanf(str, "%d-%d-%d %d:%d:%d", &y, &m, &d, &h, &min, &s);
return 0;
}
四、printf、fprintf、sprintf 区别及 stdout 与 stderr 差异
1. 三个输出函数核心区别
| 函数 | 输出位置 | 核心用途 |
|---|---|---|
| printf | 标准输出 stdout | 直接打印内容到屏幕(默认输出设备) |
| fprintf | 指定文件/流(如 stdout、stderr、文件指针) | 将内容打印到指定文件或流,可用于日志写入、错误输出 |
| sprintf | 字符数组缓冲区(buf) | 将数据拼接成指定格式的字符串,不直接输出,用于后续处理 |
2. stdout(标准输出)与 stderr(标准错误)区别
(1)stdout(标准输出)
-
缓冲机制:默认行缓冲,只有遇到换行符
\n时,才会将缓冲区内容输出到屏幕 -
可重定向:支持通过命令行重定向(如
./a.out > log.txt),将输出内容写入文件,而非屏幕 -
用途:输出正常的程序运行信息、结果等
(2)stderr(标准错误)
-
缓冲机制:无缓冲(或行缓冲,取决于系统),内容会立即输出,不会等待缓冲区满或换行符
-
重定向特性:默认不随 stdout 一起重定向,即使 stdout 被重定向到文件,stderr 仍会输出到屏幕
-
用途:专门输出程序运行中的错误信息,确保错误能及时被开发者看到,不与正常输出混淆
(3)示例代码
cpp
#include <stdio.h>
int main() {
printf("正常消息\n"); // 输出到 stdout,行缓冲,遇\n输出
fprintf(stdout, "正常输出\n"); // 与 printf 功能一致,显式指定
stdout fprintf(stderr, "错误信息!\n");// 输出到 stderr,立即输出,不缓冲
return 0;
}
(4)核心区别
-
缓冲差异:stdout 有行缓冲,stderr 无缓冲(立即输出)
-
重定向差异:stdout 可被重定向,stderr 默认不随 stdout 重定向
-
用途差异:stdout 输出正常信息,stderr 输出错误信息,避免两者混淆
五、核心知识点精简总结
1. 时间函数
-
time():秒级精度,适用于简单时间需求
-
gettimeofday():微秒级精度,Linux 最常用
-
clock_gettime():纳秒级精度,高精度计时首选
-
localtime()/gmtime():将时间戳转换为年月日时分秒格式
2. 时间格式化
-
sprintf:时间 → 字符串(格式化存入缓冲区)
-
sscanf:字符串 → 时间(解析字符串获取时间数据)
3. 输出函数
-
printf → 输出到屏幕(stdout)
-
fprintf → 输出到指定文件/流
-
sprintf → 输出到字符数组(拼接字符串)
4. stdout vs stderr
-
stdout:缓冲、正常输出、可重定向
-
stderr:不缓冲、错误输出、不随 stdout 重定向