【问题标题】:Should the POSIX 'CLOCK_REALTIME' clock be referenced to the UTC epoch?POSIX 'CLOCK_REALTIME' 时钟是否应该参考 UTC 纪元?
【发布时间】:2017-08-23 07:22:09
【问题描述】:

我正在使用 POSIX clock_gettime(CLOCK_REALTIME, &curr_time) 来获取 CLOCK_REALTIME 时钟的当前时间。我了解 CLOCK_REALTIME 和 CLOCK_MONOTONIC 之间的区别。但是,我不知道与 CLOCK_REALTIME 相关的纪元。

我的第一个猜测是,它将是自 UTC 纪元以来经过的秒数/纳秒数。但是,我得到的值是 ~180000 秒,即 ~50 小时。显然不是自 UTC 纪元以来经过的时间。

所以我的问题是:CLOCK_REALTIME 是针对什么引用的?重启?平台专用? UTC,我只是做错了什么?

谢谢,

【问题讨论】:

  • 向我们展示您使用的代码,CLOCK_REALTIME (今天)应该是十亿半(几分钟前得到 1491312994)。

标签: c time posix


【解决方案1】:

CLOCK_REALTIME 与 Unix 纪元相关(“UTC 纪元”是同一回事,但不是正确的命名方式。它只是 UTC 时区中的 Unix 纪元)。

试试这个代码:

#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);
}

【讨论】:

    【解决方案2】:

    POSIX specification for clock_gettimeCLOCK_REALTIME 的零点定义为“纪元”:

    所有实现都应支持CLOCK_REALTIME 中的clock_id,如&lt;time.h&gt; 中所定义。该时钟表示测量系统实时时间的时钟。对于这个时钟,clock_gettime() 返回并由clock_settime() 指定的值表示自纪元以来的时间量(以秒和纳秒为单位)。

    它在其"General Concepts" chapter, section 4.16 中定义了“时代”一词:

    协调世界时名称(以秒 (tm_sec)、分钟 (tm_min)、小时 (tm_hour)、一年中 1 月 1 日以来的天数 (tm_yday) 和日历年减去 1900 (tm_year) 的形式指定)是相关的根据下面的表达式,表示为自纪元以来的秒数。

    如果年份 =1970 且值为非负数,则该值与根据 C 语言表达式的协调世界时名称相关,其中 tm_sec、tm_min、tm_hour、tm_yday 和 tm_year 均为整数类型:

    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 章的下一句中进行了说明:

    自 Epoch 以来的实际时间与当前秒数之间的关系未指定。

    也就是说,POSIX 不需要你的计算机时钟是准确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2013-10-02
      相关资源
      最近更新 更多