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
中)。如果你把timespec
的tv_sec
成员传递给localtime
或localtime_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
您可以随心所欲地处理timespec
的tv_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的介绍说明的主要内容,如果未能解决你的问题,请参考以下文章
使用clock_gettime在arduino中进行纳秒测量