You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:34:03