我使用POSIX clock_gettime(CLOCK_REALTIME,& curr_time)来获取CLOCK_REALTIME时钟的当前时间。我理解CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别。但是,我不知道的是与CLOCK_REALTIME相关的纪元。
我的第一个猜测是它将是自UTC纪元以来经过的秒/纳秒。但是,我得到的值是~180000秒,即~50小时。显然不是自UTC时代以来经过的时间。
所以我的问题是:引用的CLOCK_REALTIME是什么?重启?平台特定? UTC和我只是做错了什么?
谢谢,
答案 0 :(得分:0)
CLOCK_REALTIME与Unix时代联系在一起(" UTC时代"同样的事情,但不是正确的命名方式。它只是UTC时区的Unix纪元。) / p>
试试这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int main(void)
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
printf("%ld\n", ts.tv_sec);
exit(0);
}
答案 1 :(得分:0)
POSIX specification for clock_gettime
将CLOCK_REALTIME
的零点定义为“时代”:
所有实现应支持
clock_id
中定义的CLOCK_REALTIME
中的<time.h>
。该时钟表示测量系统实时时间的时钟。对于此时钟,由clock_gettime()
返回并由clock_settime()
指定的值代表自新纪元以来的时间量(秒和纳秒)。
它在其"General Concepts" chapter, section 4.16中定义了“时代”:
与世界标准时间名称相关(以秒(tm_sec),分钟(tm_min),小时(tm_hour),自一年1月1日起的天(tm_yday)和日历年减1900(tm_year)进行指定)根据以下表达式,将时间调整为以纪元为单位的秒数。
如果年份为<1970或值为负,则关系不确定。如果年份> = 1970并且值是非负数,则根据C语言表达式,该值与协调世界时名称相关,其中tm_sec,tm_min,tm_hour,tm_yday和tm_year均为整数类型: / p>
tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
如果将该表达式放在等式的一侧,将零放在另一侧,然后对年,时,分,秒的范围加上通常的约束,则会发现“时代”对应于ISO日历日期1970-01-01T00:00:00Z。为什么他们不只是这么说,我不知道。
您观察到的现象clock_gettime(CLOCK_REALTIME)
自1970-01-01T00:00:00Z起产生了大约50个小时的值,这是POSIX第4章的下一句话:
自从指定大纪元以来,一天中的实际时间与秒数的当前值之间的关系。
这就是说,POSIX不需要您的计算机时钟是准确的。