clock_gettime是UTC时间还是本地时区?

时间:2011-12-16 09:00:40

标签: linux posix

函数clock_gettime是否返回以UTC或本地时区的纪元测量的时间戳?

我知道time应该来自UTC时代,但我找不到任何引用说clock_gettime也是如此。

4 个答案:

答案 0 :(得分:15)

引用维基百科,Unix时代为defined

  

1970年1月1日(或1970-01-01T00:00:00Z ISO 8601)的时间00:00:00 UTC

由此可见,对“时代”的任何提及都意味着UTC。

答案 1 :(得分:6)

实际上,这个问题没有多大意义。有关时间相关功能的概述,请参阅time(7)

任何时钟设备都会返回过去某个原点事件测量的时间。 Unix(和Posix)约定是从Epoch(1970年开始,aix's answer解释)来衡量它。

以UTC或当地时间显示某些时间,或使用法国革命日历,或使用Maya日历,或您感兴趣的任何文化中的任何其他日历,都不会改变时间。只有那个时间的显示(或显示的形式)会改变。

有点像说两个 deux 1 + 1 2 ,或者10b -with b 表示二进制 - 是相同编号的所有表示。

回到问题,man page of clock_gettime给出了问题的准确答案。这取决于您要求的 clk_id ,对于CLOCK_REALTIME,时间是从Unix Epoch开始计算的。对于其他时钟(例如CLOCK_MONOTONIC),未指定使用的原点。

(我对这里的问题数量感到非常惊讶,这些问题可以通过查看 man 来快速回答。我不明白人们花更多时间去问问题的逻辑这里要问一下 - 只需在他们的Linux机器上输入man clock_gettime - 进入手册页。)

时区概念仅与localtime&amp;返回的struct tm相关。 gmtime(及相关)功能。从Epoch(例如time(2)gettimeofdaytime_t clock_gettime的结果)测量的时间(例如,某些CLOCK_REALTIME)没有时区。< / p>

Unix Epoch是1970年1月1日0:00 UTC(根据(time_t)0的定义),在我的时区(MET = Paris / France),相同的Epoch是Thu Jan 1 01:00:00 MET 1970年。

答案 2 :(得分:0)

取决于......

如果你打电话给clock_gettime(1),很可能,你的linux已经开始了。

答案 3 :(得分:0)

只是为了充实这些答案:

clock_gettime(),POSIX 标准函数采用时钟标识符的第一个参数。

在撰写本文时,一个通用标识符是 CLOCK_REALTIME,它确实获取 UTC 纪元时间 - 假设 UNIX 时钟设置正确。

还有 CLOCK_MONOTONIC,它是从过去未指定时间点设置的时钟。通常,我已经看到这是在进程调用后随着时间的推移而实现的。

以及强制性示例:

struct timespec epochTime;
struct timespec otherTime;

// fetch the system time in UTC
clock_gettime( CLOCK_REALTIME, &epochTime );  // CLOCK_REALTIME returns 1970 Epoch Time

// Fetch some equally-valid time, but with an unknown start
// But relative comparisons are absolutely OK
clock_gettime( CLOCK_MONOTONIC, &otherTime );