树莓派4(Raspbian系统)下获取微秒级精度时间戳的技术咨询
树莓派4(最新Raspbian)获取微秒级时间戳的可行方案
没错,struct tm确实只能提供秒级精度,没法满足你的微秒需求。好在Raspbian是基于Linux的系统,我们可以用POSIX标准的clock_gettime()函数来获取高精度时间——它能拿到纳秒级的时间数据,完全覆盖微秒级的要求。
下面是适配你现有代码的修改版,直接替换原来的时间获取与输出部分即可:
#include <time.h> // 确保包含这个头文件 // 获取高精度实时时间 struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); // CLOCK_REALTIME对应系统日历时间,和time(NULL)基准一致 // 将秒数部分转换为tm结构(和你原来的逻辑一致) struct tm tm = *localtime(&ts.tv_sec); // 格式化输出:秒后追加微秒(纳秒转微秒,保留6位补零) fprintf(timestampFile, "now: %d-%02d-%02d %02d:%02d:%02d.%06ld\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec / 1000); // 纳秒除以1000得到微秒
几个关键细节要注意:
- 时钟类型选择:
CLOCK_REALTIME是系统的实时日历时钟,和你之前用time(NULL)获取的时间是同一个基准,适合生成带日期的时间戳。如果需要不受系统时间调整(比如NTP同步)影响的单调递增时间,可以改用CLOCK_MONOTONIC,但这个时钟没有日期含义,根据你的需求选CLOCK_REALTIME就好。 - 微秒格式化:
struct timespec的tv_nsec字段存储的是0-999999999的纳秒数,除以1000得到微秒。用%06ld格式化可以确保输出6位数字,不足的自动补零(比如98164微秒会显示为098164)。如果你想要和示例一致的5位格式,就改成ts.tv_nsec / 10000,格式化用%05ld即可。 - 编译兼容性:在较新版本的GCC和Linux内核(树莓派4的最新Raspbian肯定满足)下,编译时不需要额外链接库。如果遇到编译错误,尝试添加
-lrt参数链接实时库。
如果你用的是C++11或更高版本,也可以用<chrono>库来实现,但考虑到你当前的代码是C风格,用clock_gettime()改动最小,不需要调整现有代码结构。
替换后,你的输出就会变成类似now: 2021-09-19 10:46:06.098164(6位微秒),完全符合高精度需求。
内容的提问来源于stack exchange,提问作者Lyra Orwell
相关产品推荐
相关产品推荐

