关注分享主机优惠活动
国内外VPS云服务器

linux有计算时间的功能吗(linux计算时差)

大部分人不理解这篇文章“linux有没有计算时间的功能”的知识点,所以主机频道为你总结了以下内容。内容详细,步骤清晰,具有一定的参考价值。希望你看完这篇文章能有所收获。我们来看看这篇文章《linux有没有计算时间的功能》。

Linux有计算时间的函数,比如time(),gettimeofday()和settimeofday(),clock_gettime()等等。

1.得到时间相关函数

1.1得到二阶时差函数

# include & lttime.h & gt
time _ t time(time _ t * timer);//当前时间可以通过函数返回值或者定时器变量获取。time_t实际上是一个长整数,表示从UTC时间(1970年1月1日0: 00: 00,Linux系统中的Epoch time)到当前系统时间的时差秒。

1.2获得微秒时差函数

# include & ltsys/time . h & gt;
# include & ltunistd.h & gt
结构时间间隔{
time _ t tv _ sec/*秒*/
suseconds _ t tv _ usec/*微秒*/
};

结构时区{

int tz _ minuteswest/*格林威治以西几分钟*/

int tz _ dsttime/* DST校正的类型*/

};

//函数成功返回0,失败返回-1,其中timezone是与时区相关的结构。
int gettimeofday(struct time val * TV,struct time zone * tz);

//用于设置已建立的时间和时区信息。
int settimeofday(const struct time val * TV,const struct time zone * gz);1.3获得纳秒时差函数

# include & lttime.h & gt

/*
其中,clk_id用于制定相应的时钟类型,不同的类型可以获得不同的时间值。有四种具体类型:
Clock _ real time:系统的实时时间,从UTC开始。如果用户改变了时间,计时时间也会相应改变;
Clock _ Monotonic:时间从系统启动开始算,即使用户更改了时间,也没有影响;
Clock _ process _ CPU time _ ID:从本进程开始到执行当前程序系统CPU所用的时间;
Clock _ thread _ CPU time _ ID:从这个线程开始到执行当前程序系统CPU所用的时间。

*/

结构时间规范{
time _ t tv _ sec//s
长tv _ nsec//ns
};

int clock _ gettime(clock id _ t clk _ id,struct timespec * TP);2.变换时间相关函数

2.1将通过上述采集时间函数获得的时间参数time_t转换成结构。

Struct tm,包含年、月、日等非常详细的字段。如下图所示:

# include & lttime.h & gt

结构tm{
int tm _ sec//秒
int tm _ min//分钟
int tm _ hour//小时;取值区间为[0,23]
int tm _ mday//天;取值区间为[1,31]
int tm _ mon//月;取值区间为[0,11];0表示1月会依次增加到12月。
int tm _ year//年份;它的价值是从1900年到今年。
int tm _ wday//周;0代表星期日,1代表星期一,依此类推。
int tm _ yday//日期;0代表1月1日。
int tm _ isdst//夏令时标识符;当采用夏令时时,为正值;不使用时,t为0;不确定时,为负*/
};将time_t转换为struct tm结构的常用函数如下:

# include & lttime.h & gt
struct TM * GM time(const time _ t * time p);
struct TM * local time(const time _ t * time p);gmtime()和localtime()函数可以将time_t数据格式转换为tm格式类型。不同的是gmtime()转换的结果是GMT(中部时区)对应的信息,而localtime()函数转换的结果是当前时区的信息。

2.2将time_t转换成我们习惯的时间和日期字符串。

相应的转换函数如下:

# include & lttime.h & gt
char * ctime(time _ t * time p);2.3将struct tm转换为time_t

相应的功能如下:

# include & lttime.h & gt
time _ t mktime(struct TM * p _ TM);2.4将struct tm转换成我们习惯的时间和日期字符串。

相应的功能如下:

# include & lttime.h & gt
char * ASC time(const struct TM * p _ TM);//习惯字符串Thu Dec 9 07:13:35 20212.5将时间字符串转换为struct tm格式。

/**************************************
**描述:根据指定的格式格式将struct tm转换为字符串。
**参数:
** *s:要转换的时间字符串。
* * *格式:时间字符串的格式。
** *tm:转换后的tm时间。
**************************************/
char *strptime(const char *s,const char *format,struct TM * TM);2.6根据指定的格式格式将struct tm转换成字符串。

/**************************************
**描述:根据指定的格式格式将struct tm转换为字符串。
**参数:
** *s:生成的时间字符串
** max:字符串中的最大字符数(即可以生成的最大字符数)。
* * *格式:生成的字符串的格式。
** *tm:要转换的tm时间。
**************************************/
size_t strftime(char *s,size_t max,const char *format,const struct TM * TM);举个例子

# include & ltstdio.h & gt
# include & ltstring.h & gt
# include & ltunistd.h & gt
# include & lttime.h & gt
# include & ltsys/time . h & gt;

int main(int argc,char *argv[])
{
char * pstr = NULL
struct tm * ptm = NULL

printf(& quot;* * * * * * * * * * * *使用ctime获取time _ t * * * * * * * * * * * * \ n ");
time _ t times = 0;
时间(& amp次);
printf(& quot;time _ t:% LD \ n \ n & quot;,次);
printf(& quot;* * * * * * * * * * * *使用ctime将time_t转换为我们习惯的时间和日期字符串* * * * * * * * * * * * * * * * \ n & quot);
pstr = ctime(& amp;次);
printf(& quot;ctime:% s \ n & quot;,pstr);
printf(& quot;* * * * * * * * * * * *使用gmtime将time_t转换为struct tm时间和日期* * * * * * * * * * * * * * \ n & quot);
PTM = gmtime(& amp;次);
printf(& quot;时间:%d:%d:%d,PTM-& gt;tm_hour,PTM-& gt;tm_min,PTM-& gt;TM _ sec);
printf(& quot;日期:%d:%d:%d,PTM-& gt;tm_year+1900,PTM-& gt;tm_mon+1,PTM-& gt;TM _ mday);
printf(& quot;年:wday:%d yday:%d isdst:%d\n,PTM-& gt;tm_wday,PTM-& gt;tm_yday,PTM-& gt;TM _ isdst);
printf(& quot;* * * * * * * * * * * *使用asctime将struct tm转换为我们习惯使用的时间和日期字符串* * * * * * * * * * * * * * \ n & quot);
pstr = ASC time(PTM);
printf(& quot;ASC time:% s \ n \ n & quot;,pstr);
printf(& quot;* * * * * * * * * * * *使用localtime将time_t转换为struct tm时间和日期* * * * * * * * * * * * * * \ n & quot);
ptm = localtime。次);
printf(& quot;时间:%d:%d:%d,PTM-& gt;tm_hour,PTM-& gt;tm_min,PTM-& gt;TM _ sec);
printf(& quot;日期:%d:%d:%d,PTM-& gt;tm_year+1900,PTM-& gt;tm_mon+1,PTM-& gt;TM _ mday);
printf(& quot;年:wday:% d yday:% d isdst:% d \ n & quot;,PTM-& gt;tm_wday,PTM-& gt;tm_yday,PTM-& gt;TM _ isdst);

pstr = ASC time(PTM);
printf(& quot;ASC time:% s \ n \ n & quot;,pstr);

printf(& quot;* * * * * * * * * * * *使用gettimeofday获取微秒时间* * * * * * * * * * * * \ n ");
结构化电视;
结构时区tz;
gettimeofday(& amp;电视& amptz);
ptm = localtime。TV . TV _ sec);
printf(& quot;时间:%d:%d:%d,PTM-& gt;tm_hour,PTM-& gt;tm_min,PTM-& gt;TM _ sec);
printf(& quot;日期:%d:%d:%d,PTM-& gt;tm_year+1900,PTM-& gt;tm_mon+1,PTM-& gt;TM _ mday);
printf(& quot;年:wday:% d yday:% d isdst:% d \ n & quot;,PTM-& gt;tm_wday,PTM-& gt;tm_yday,PTM-& gt;TM _ isdst);
printf(& quot;TV _ usec:% LD \ n \ n & quot;,TV . TV _ usec);
printf(& quot;* * * * * * * * * * * *使用clock_gettime获得纳秒时间* * * * * * * * * * * * \ n & quot);
struct timespec tp
CLOCK _ gettime(CLOCK _ real time & amp;TP);
ptm = localtime。TP . TV _ sec);
printf(& quot;时间:%d:%d:%d,PTM-& gt;tm_hour,PTM-& gt;tm_min,PTM-& gt;TM _ sec);
printf(& quot;日期:%d:%d:%d,PTM-& gt;tm_year+1900,PTM-& gt;tm_mon+1,PTM-& gt;TM _ mday);
printf(& quot;年:wday:% d yday:% d isdst:% d \ n & quot;,PTM-& gt;tm_wday,PTM-& gt;tm_yday,PTM-& gt;TM _ isdst);
printf(& quot;tp.tv_nsec:%ld\n\n&quot,TP . TV _ nsec);
返回0;
}特定时间字符相互转换。

int str_to_time(void)
{
char pstr[128]= { 0 };
struct TM t;
strptime(& quot;2021-04-23 12:34:56 & quot;,& quot% Y-% M-% d % H:% M:% S & quot;,& ampt);
printf(& quot;**** tm_isdst: %d,tm_yday:%d,tm_wday%d,\ n % d-% d-% d \ n % d:% d:% d:% d \ n & quot;,
t.tm_isdst,t.tm_yday,t.tm_wday,t.tm_year+1900,t.tm_mon+1,t.tm_mday,
t . TM _小时,t . TM _分钟,t . TM _秒);
printf(& quot;mktime ts:% LD \ n & quot;,mktime(& amp;t));
printf(& quot;ASC time:% s \ n & quot;,ASC time(& amp;t));
strftime(pstr,sizeof(pstr),& quot% Y-% M-% d % H:% M:% S & quot;,& ampt);
printf(& quot;pstr:% s \ n & quot;,pstr);
}

int时间到字符串(void)
{
char pstr[128]= { 0 };
struct tm t = {
。tm_sec = 56,/*秒(0-60) */
。tm_min = 34,/*分钟(0-59) */
。tm_hour = 12,/*小时(0-23) */
。tm_mday = 23,/*一个月中的第几天(1-31) */
。tm_mon = 4-1,/* Month (0-11) */
。tm_year = 2021-1900,/* Year - 1900 */
。tm_wday = 5,/*星期几(0-6,星期日= 0) */
。tm_yday = 113,/*年中的某一天(0-365,1 Jan = 0) */
。tm_isdst = 0,/*夏令时*/
};
strftime(pstr,sizeof(pstr),& quot% Y-% M-% d % H:% M:% S & quot;,& ampt);
printf(& quot;pstr:% s \ n & quot;,pstr);
}如果想获得系统启动时的时间,即使用户更改了时间,也不会影响以毫秒为单位的时间,例如:

无符号long long clock_systick_get(void)
{
int ret =-1;
无符号长时间;
int CNT = 0;
struct timespec now = {0,0}。

while(ret & lt;0 & amp& ampcnt & lt3)
{
ret = CLOCK _ gettime(CLOCK _ MONOTONIC & amp;现在);//采集失败重试,最多执行3次。
cnt++;
}
time = now . TV _ sec * 100主机频道now . TV _ nsec/(1000000);
返回时间;
}

未经允许不得转载:主机频道 » linux有计算时间的功能吗(linux计算时差)

评论 抢沙发

评论前必须登录!