Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以微秒为单位获取时间戳,最大可变大小为32位_C_Timestamp - Fatal编程技术网

C 以微秒为单位获取时间戳,最大可变大小为32位

C 以微秒为单位获取时间戳,最大可变大小为32位,c,timestamp,C,Timestamp,我需要一个以微秒为分辨率的时间戳。我找到了一些选项,比如使用timeval结构和调用gettimeofday。问题是所有结构中都有长变量,我只能处理32位变量 如何仅使用32位变量在c中获得时间戳?是时间和时钟相关编程的很好参考,通常包括函数原型、结构定义以及与您的请求相关的编程示例。你应该看看 有几个答案可能适合你的需要。公认的答案是一般性的: 对于32位系统: 这特别针对美国的决议。但是,它是POSIX专用的,可能会违反您的规范: #include <stdio.h> #incl

我需要一个以微秒为分辨率的时间戳。我找到了一些选项,比如使用timeval结构和调用gettimeofday。问题是所有结构中都有长变量,我只能处理32位变量

如何仅使用32位变量在c中获得时间戳?

是时间和时钟相关编程的很好参考,通常包括函数原型、结构定义以及与您的请求相关的编程示例。你应该看看

有几个答案可能适合你的需要。公认的答案是一般性的:

对于32位系统:

这特别针对美国的决议。但是,它是POSIX专用的,可能会违反您的规范:

#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