Linux 时间函数、格式化及 printf 相关总结

一、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 重定向

相关推荐
平常心cyk8 小时前
Linux快速复习——常用命令
linux
w6100104668 小时前
CKAD-2026-金丝雀部署
linux·运维·服务器·k8s
.小小陈.8 小时前
深度拆解 Linux Ext 系列文件系统:从硬件底层到软硬链接全流程
linux·运维·服务器
Frank_refuel8 小时前
Linux操作系统 - > 进程信号(中)
linux·运维·服务器
cookies_s_s9 小时前
C++ 模板与泛型编程
linux·服务器·开发语言·c++
2401_892070989 小时前
【Linux C++ 日志系统实战】Logger 日志器完整实现:级别控制、宏封装、动态输出、自动崩溃退出
linux·c++·日志系统
蓝天居士9 小时前
cpio命令详解(1)
linux·cpio
原来是猿9 小时前
Linux进程信号详解(一):信号快速认识
linux·c++·算法
minji...9 小时前
Linux 多线程(二)进程虚拟地址空间&&页表&&物理地址
linux·运维·服务器