clock_gettime的介绍说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了clock_gettime的介绍说明相关的知识,希望对你有一定的参考价值。

参考技术A

函数"clock_gettime"是基于Linux C语言的时间函数,他可以用于计算精度和纳秒 clk_id : 检索和设置的clk_id指定的时钟时间。
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,
中间时刻如果系统时间被用户改成其他,则对应的时间相应改变  CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响  CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间  CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
struct timespec

time_t tv_sec; /* 秒*/
long tv_nsec; /* 纳秒*/
; [root@localhost algorithm]# ./testClock_gettime  CLOCK_REALTIME: 1418955427, 611567940  CLOCK_MONOTONIC: 687, 121482785  CLOCK_PROCESS_CPUTIME_ID: 0, 7062436  CLOCK_THREAD_CPUTIME_ID: 0, 7073050

c++ clock_gettime() 和夏令时

【中文标题】c++ clock_gettime() 和夏令时【英文标题】:c++ clock_gettime() and daylight savings 【发布时间】:2012-06-23 01:27:32 【问题描述】:

我在我的 C++ 程序中使用 clock_gettime() 来获取当前时间。但是,返回值是UTC 纪元以来的秒数。在夏令时期间,当时间偏移一小时时,此代码可能会在我的时区混乱。

系统本身有 NTP 同步它以始终在 EST 中提供正确的时间。有没有办法让clock_gettime() 报告当地时间而不是UTC,这样我就可以避免夏令时问题?

【问题讨论】:

你为什么不直接从 UTC 转换为本地时间?将“获取时间”与“转换为本地时间”分开。 当然可以,但是我必须每年在我的代码中手动更改转换系数两次。 我不是建议硬编码它。我建议使用可识别时区的日期/时间库来执行转换。 还可以考虑使用cctz 库进行转换。 【参考方案1】:

意识到time 还报告自 1970 年初以来的秒数(在 time_t 中)。如果你把timespectv_sec 成员传递给localtimelocaltime_r,你应该得到你想要的。

timespec tsv;
clock_gettime(CLOCK_REALTIME, &tsv);
time_t t = tsv.tv_sec; // just in case types aren't the same
tm tmv;
localtime_r(&t, &tmv); // populate tmv with local time info

您可以随心所欲地处理timespectv_nsec 成员。

【讨论】:

这段代码似乎无法为我编译,我遇到了这个问题:错误:无法转换 ?timespec*?到 ?const time_t*?论据?1?到 ?tm* localtime_r(const time_t*, tm*)? @user788171:代码为我逐字编译。我从编译后的代码中粘贴了它。【参考方案2】:

如果您使用的是 Windows,则可以使用此 GetTimeZoneInformation,但您必须包含 Windows API。

实现此目的的另一种方法是 struct tm。您将在此处找到详细信息:struct tm。 “如果夏令时有效,夏令时标志 (tm_isdst) 大于零,如果夏令时无效,则为零,如果信息不可用,则小于零。”我认为这是更简单的方法。

【讨论】:

【参考方案3】:

如果您能够使用 Boost,则可以使用日期时间库显式控制所有这些:http://www.boost.org/doc/libs/1_49_0/doc/html/date_time.html

我不得不在各种平台和各种语言上处理时间,我发现 boost 库比其他任何可用的库都优越得多。

【讨论】:

对不起,这对我来说不是很有用。【参考方案4】:
#include <time.h>
time_t rawtime;
struct tm *timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);
    if (timeinfo->tm_isdst)
        Hour -= 1; // daylight savings time

【讨论】:

这段代码是我在Windows Visual Studio C++中使用的 以上代码来自cplusplus.com/reference/ctime/tm 但是如果你只使用timeinfo中的日期和时间,月份是错误的。

以上是关于clock_gettime的介绍说明的主要内容,如果未能解决你的问题,请参考以下文章

c++ clock_gettime() 和夏令时

clock_gettime() 没有给出正确的输出[重复]

clock_gettime的主要例子

使用clock_gettime在arduino中进行纳秒测量

使用 ICC 在 Linux 中未定义的对 clock_gettime() 的引用

在Linux上确定clock_gettime分辨率的正确方法