C 以微秒为单位获取时间戳,最大可变大小为32位
我需要一个以微秒为分辨率的时间戳。我找到了一些选项,比如使用timeval结构和调用gettimeofday。问题是所有结构中都有长变量,我只能处理32位变量 如何仅使用32位变量在c中获得时间戳?是时间和时钟相关编程的很好参考,通常包括函数原型、结构定义以及与您的请求相关的编程示例。你应该看看 有几个答案可能适合你的需要。公认的答案是一般性的: 对于32位系统: 这特别针对美国的决议。但是,它是POSIX专用的,可能会违反您的规范:C 以微秒为单位获取时间戳,最大可变大小为32位,c,timestamp,C,Timestamp,我需要一个以微秒为分辨率的时间戳。我找到了一些选项,比如使用timeval结构和调用gettimeofday。问题是所有结构中都有长变量,我只能处理32位变量 如何仅使用32位变量在c中获得时间戳?是时间和时钟相关编程的很好参考,通常包括函数原型、结构定义以及与您的请求相关的编程示例。你应该看看 有几个答案可能适合你的需要。公认的答案是一般性的: 对于32位系统: 这特别针对美国的决议。但是,它是POSIX专用的,可能会违反您的规范: #include <stdio.h> #incl
#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>
int main(void) {
struct timespec tms;
/* The C11 way */
/* if (! timespec_get(&tms, TIME_UTC)) { */
/* POSIX.1-2008 way */
if (clock_gettime(CLOCK_REALTIME,&tms)) {
return -1;
}
/* seconds, multiplied with 1 million */
int64_t micros = tms.tv_sec * 1000000;
/* Add full microseconds */
micros += tms.tv_nsec/1000;
/* round up if necessary */
if (tms.tv_nsec % 1000 >= 500) {
++micros;
}
printf("Microseconds: %"PRId64"\n",micros);
return 0;
}
如果struct timeval字段采用长整数格式,可以采用32位格式,也可以不采用32位格式,这是因为您需要它的大小。让我们做一些分析:我以NTP格式获取此时间戳,并将其转换为struct timeval格式,以便在我的系统上使用now时间戳:
ntpts.c:120:process: NTP(dec): 3771731346.612550000
ntpts.c:121:process: NTP(hex): 0xe0d00d92.9cd013a9
ntpts.c:123:process: UNIX: 1562742546/0x5d258f12
ntpts.c:135:process: gmtime: 10/jul/2019, 07:09:06.612550000
ntpts.c:136:process: localtime: 10/jul/2019, 10:09:06.612550000
tv_sec ==> 1562742546
tv_usec ==> 612550
因此,要获得一个时间戳,其分辨率为1970年1月1日00:00h起的秒数,微秒,至少需要52位,通常tv_sec是一个长或长64位字段,因为2038年2月将发生溢出,一些系统已经对此进行了修补,tv_usec可以安装在24位变量usec go 0到999999中,因此它们至少需要20位,但编译器填充至少会使其大小为32位
如果您想保留32位的完整usec分辨率,则至少需要20位来表示一秒钟的分数,而只有12位来表示整数部分。在这种情况下,您只能表示从0到4095之间的秒数,也就是一个多小时01h8m16s。这是可以处理的,但要使该时间戳成为绝对时间戳,您需要引用该时间戳在历史上属于哪个绝对小时
另一方面,如果将粒度减小到MSEC,则可以获得超过1000个小时的参考窗口,您需要考虑这一点,最终决定下一步该做什么。 修正案
顺便说一句,gettimeofday2系统调用实际上已被弃用。现在使用的几乎所有系统都使用clock_gettime2系统调用,它的分辨率为纳秒,允许您选择适当的系统时钟来获取时间戳。如果您正在使用的平台为suseconds_t类型提供64位长的值,为什么您不能使用它?如果该值为64位,则您的平台显然本机支持64位值。请查看接受答案注释中的两个选项中的第一个选项:使用32位变量存储微秒时间戳可以包含一个多小时的时间跨度。运行时间最长不超过30分钟。可能的时间重复返回秒,不是微秒,如果长为64位,则clock_gettime使用64位,因此两者都不完全符合规定的要求。在我看来,32位的要求是毫无意义的,几乎让这个问题无法回答。这就是我收到的要求。“我不需要它运行很长时间,所以它应该足够了。”AndrewHenle-同意,感谢您指出这两个观察结果。我做了一些小的修改,没有调整示例,只是指出了它们的不足。
ntpts.c:120:process: NTP(dec): 3771731346.612550000
ntpts.c:121:process: NTP(hex): 0xe0d00d92.9cd013a9
ntpts.c:123:process: UNIX: 1562742546/0x5d258f12
ntpts.c:135:process: gmtime: 10/jul/2019, 07:09:06.612550000
ntpts.c:136:process: localtime: 10/jul/2019, 10:09:06.612550000
tv_sec ==> 1562742546
tv_usec ==> 612550