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

张开发
2026/4/4 18:54:39 15 分钟阅读
Linux 时间函数、格式化及 printf 相关总结
一、Linux 获取时间的常用函数按精度从低到高1. time()精度秒1s返回值从 1970-01-01 00:00 到当前的秒数time_t 类型应用场景无需高精度需求如获取时间戳、日志时间、文件时间戳示例代码#include time.h time_t now time(NULL);2. gettimeofday()精度微秒1μs 10⁻⁶s返回值秒tv_sec 微秒tv_usec对应 struct timeval 结构体应用场景性能计时、网络时间等大多数高精度计时场景是 Linux 中最常用的时间函数示例代码#include sys/time.h struct timeval tv; gettimeofday(tv, NULL);3. clock_gettime()精度纳秒1ns 10⁻⁹s特性Linux 高精度标准接口POSIX 标准支持多种时钟类型常用时钟类型CLOCK_REALTIME真实时间可被系统修改CLOCK_MONOTONIC单调递增时间不会回退最适合计时场景应用场景高精度计时、性能分析、音视频开发、驱动开发等示例代码#include time.h struct timespec ts; clock_gettime(CLOCK_MONOTONIC, ts);4. localtime() / gmtime()功能将 time_t 类型的时间戳转换为年月日时分秒格式struct tm 结构体区别localtime()转换为本地时区的时间gmtime()转换为 UTC 0 时区的时间示例代码struct tm* t localtime(now); // now 为 time_t 类型变量二、时间函数精度对比表函数精度对应数据类型time()秒time_tgettimeofday()微秒struct timevalclock_gettime()纳秒struct timespec三、时间格式化sprintf 与 sscanf 用法1. sprintf时间 → 字符串格式化输出功能将 struct tm 类型的时间数据格式化为指定格式的字符串存入字符数组缓冲区。#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字符串 → 时间解析输入功能从指定格式的字符串中解析出年、月、日、时、分、秒等时间数据存入对应变量。#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标准错误区别1stdout标准输出缓冲机制默认行缓冲只有遇到换行符\n时才会将缓冲区内容输出到屏幕可重定向支持通过命令行重定向如./a.out log.txt将输出内容写入文件而非屏幕用途输出正常的程序运行信息、结果等2stderr标准错误缓冲机制无缓冲或行缓冲取决于系统内容会立即输出不会等待缓冲区满或换行符重定向特性默认不随 stdout 一起重定向即使 stdout 被重定向到文件stderr 仍会输出到屏幕用途专门输出程序运行中的错误信息确保错误能及时被开发者看到不与正常输出混淆3示例代码#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 → 输出到屏幕stdoutfprintf → 输出到指定文件/流sprintf → 输出到字符数组拼接字符串4. stdout vs stderrstdout缓冲、正常输出、可重定向stderr不缓冲、错误输出、不随 stdout 重定向

更多文章