,,Linux系统中时间的获取和使用

,,Linux系统中时间的获取和使用

时间的获取是我们日常工作中经常遇到的。下面文章主要介绍Linux系统中时间的获取和使用的相关信息。通过示例代码非常详细的介绍,有需要的朋友可以参考一下。

Linux系统时间有两种。

(1)日历时间。该值是自协调世界时(UTC)1970年1月1日00:00:00以来经过的累计秒数。基本数据类型用time _ t保存,最后我们可以通过转换得到通常的24小时制或者12小时制时间。

(2)流程时间。也称为CPU时间,用于衡量进程使用的CPU资源。这个过程的时间是通过时钟的滴答声来计算的。

本文将为您详细介绍Linux时间的获取和使用。下面不多说了。我们来看看详细的介绍。

获取时间戳

时间()

#包含时间. h

time_t时间(time_t *calptr)

Time返回当前时间的时间戳,即从世界时到现在的秒数;

Time_t实际上是一个uint 64 _ t;

当calptr不为空时,时间戳也会写入这个指针;

呼叫示例:

#包含时间. h

#包括iostream

#包含stdlib.h

使用命名空间std

int main()

{

time _ t curTime

curTime=time(空);

cout curtimeendl;

返回0;

}

结果:

返回一串值,如1533287924。

gettimeofday()和clock_gettime()

时间函数只能得到秒精度的时间。为了获得更高精度的时间戳,还需要其他函数。Gettimeofday函数可以获得微秒精度的时间戳,用结构timeval保存;Clock_gettime函数可以获得纳秒精度的时间戳,时间戳由结构timespec保存。

#包含系统/时间. h

int gettimeofday(struct time val * TP,void * TZP);

因为历史原因tzp唯一合法的值是NULL,所以调用时写NULL就够了。

int clock _ gettime(clock id _ t clock _ id,strcut timespec * tsp);

Clock_id有多种选择。当选择CLOCK_REALTIME时,它具有与时间类似的功能,但具有更高的时间精度。

这两个函数使用的结构定义如下:

结构时间间隔

{

长tv _ sec/*秒*/

long tv _ usec/*微秒*/

};

结构时间规范

{

time _ t tv _ sec//秒

长tv _ nsec//纳秒

};

呼叫示例:

#包含时间. h

#包含系统/时间. h

#包括iostream

#包含stdlib.h

使用命名空间std

int main()

{

time _ t dwCurTime1

dwCurTime1=time(空);

struct timeval stCurTime2

gettime of day(str curtime2,NULL);

struct timespec stCurTime3

clock_gettime(CLOCK_REALTIME,str curtime 3);

cout ' time 1:' dwCurTime1 ' s ' endl;

cout ' time 2:' stcurtime2 . TV _ sec ' s,' stCurTime2.tv _ usec ' us ' endl

cout ' time 3:' stcurtime3 . TV _ sec ' s,' stCurTime3.tv _ nsec ' ns ' endl

返回0;

}

结果:

编译时,在编译命令的末尾添加-lrt链接到实时动态库,例如

g-o time 2 test _ time _ Linux _ 2 . CPP-lrt

时间1:1533289490

时间2:1533289490,133547us

时间3:1533289490秒,133550060秒

可视化时间

tm结构体

得到的时间戳并不能直观的显示现在的时间,所以我们需要用tm结构来表示我们日常生活中看到的时间。该结构定义如下:

结构商标

{

int tm _ sec/*秒,正常范围是0-59,但允许61*/

int tm _ min/*分钟,0-59*/

int tm _ hour/*小时,0-23*/

int tm _ mday/*日,即一个月中的第几天,1-31*/

int tm _ mon/*月,从1月开始,0-11 */1p-TM _ mon;

int tm _ year/* year,1900 */1900+P-TM _ year已经过去多少年了;

int tm _ wday/*星期,星期几,从星期日开始,0-6*/

int tm _ yday/*今年1月1日至今的天数,范围为0-365*/

int tm _ isdst/*夏令时标志*/

};

time_t转成tm

Gmtime和localtime可以将time_t类型的时间戳转换成tm结构,用法如下:

struct TM * GM time(const time _ t * time p);

//将time_t表示的时间转换为UTC时间,不进行时区转换,这是一个struct tm结构指针。

stuct TM * local time(const time _ t * time p);

//函数类似gmtime,但是是时区转换后的时间,也就是可以转换成北京时间。

固定格式打印时间

得到tm结构后,可以转换成字符串格式的日常使用时间,也可以直接从time_t转换过来,使用下面两个函数就可以达到目的。但是,这两个函数只能以固定格式打印时间。

//这两个函数已被标记为不推荐使用。尽量使用后面介绍的功能。

char * ASC time(const struct TM * time ptr);

char * ctime(const time _ t * time p);

呼叫示例:

#包含时间. h

#包含系统/时间. h

#包括iostream

#包含stdlib.h

使用命名空间std

int main()

{

time _ t dwCurTime1

dwCurTime1=time(空);

struct tm * pTime

pTime=local time(dwCurTime1);

char * strTime1

char * strTime2

strtime 1=ASC time(pTime);

str time 2=ctime(dwCurTime1);

cout strTime1 endl

cout strTime2 endl

返回0;

}

结果:

Fri 2018年8月3日18时24分29秒

Fri 2018年8月3日18时24分29秒

灵活安全的时间转换函数strftime()

上述两个函数因为可能的缓冲区溢出而被标记为过时,所以比较安全的方法是采用strftime方法。

/*

** @buf:存储输出的时间到了

** @maxsize:缓冲区的最大字节长度。

** @format:指定输出时间的格式。

** @tmptr:指向结构tm的指针

*/

size_t strftime(char* buf,size_t maxsize,const char *format,const struct TM * tmptr);

根据format指向字符串中的格式,我们可以将timeptr中存储的时间信息以format指定的格式输出到buf中,最多在buf中存储maxsize个字符。这个函数返回buf指向的字符串中的字符数。

strftime()函数的操作有点类似于sprintf():它标识以百分号(%)开始的格式命令集,打印格式结果放在一个字符串中。该命令将字符串strDest中各种日期和时间信息的确切表示形式格式化。格式中的其他字符按原样放入字符串中。下面列出了这些格式,它们区分大小写。

%一周中某一天的缩写

%星期几的全名。

%b月的缩写

%B月的全名

%c标准日期的时间字符串

%C年的最后两位数字

以%d的十进制表示形式表示的每个月的第几天

%D月/日/年

%e在双字符字段中,用十进制表示一个月中的第几天。

%F年-月-日

%g年的最后两位数,使用基于周的年份。

%G年,使用基于周的年。

%h的缩写月份名

24小时制中的% h小时

%I 12小时制

以%j的十进制表示形式表示的每年的第几天

%m十进制的月份。

十进制中的%M分钟

%n新行字符

%p本地AM或PM的等效显示

%r 12小时

%R显示小时和分钟:hh:mm

%S十进制秒

%t水平制表符

% t显示时、分、秒:hh:mm:ss

%u星期几,星期一是第一天(值从0到6,星期一是0)

%U一年中的第一周,以星期日为第一天(值从0到53)

%V每年的第几周,使用基于周的年份。

%w十进制星期几(值从0到6,星期日为0)

%W一年中的第几周,星期一是第一天(值从0到53)

%x标准日期字符串

%X标准时间字符串

%y不带世纪的十进制年份(值从0到99)

带有世纪部分的%Y十进制年份

%z,%Z时区名称,如果无法获取时区名称,则为空字符。

%%百分比符号

呼叫示例:

#包含时间. h

#包含系统/时间. h

#包括iostream

#包含stdlib.h

使用命名空间std

int main()

{

time _ t dwCurTime1

dwCurTime1=time(空);

struct tm * pTime

pTime=local time(dwCurTime1);

char buf[100];

strftime(buf,100,' time: %r,%a %b %d,%Y ',pTime);

cout buf endl

返回0;

}

结果:

时间:Fri 2018年8月3日下午8点18分12秒

时间函数之间的关系图

进程时间

进程时间是创建进程后使用CPU的时间。流程时间分为以下两部分:

用户时间:在用户模式下使用CPU的时间。

内核时间:内核模式下使用CPU的时间。这是执行内核调用或其他特殊任务所需的时间。

clock函数

Clock函数提供了一个简单的接口来获取进程时间,它返回一个描述进程使用的总CPU时间(包括用户时间和核心时间)的值。该函数定义如下:

#包含时间. h

clock_t时钟(无效)

//如果错误,返回-1

时钟函数返回值得计量单位是每秒钟数,将返回值除以这个计量单位就得到了进程时间的秒数

times函数

倍函数也是一个进程时间函数,有更加具体的进程时间表示,函数定义如下:

#包含系统/时间. h

clock _ t times(struct TMS * buf);

结构tms{

时钟时间

时钟时间

clock _ t tms _ cutime

clock _ t tms _ cstime

};

倍函数虽然返回类型还是clock_t,但是与时钟函数返回值的计量单位不同1000次。函数的返回值得计量单位要通过sysconf(SC_CLK_TCK)来获得。

Linux操作系统操作系统系统编程手册上一个完整的使用案例如下:

#包含时间。h

#包含系统/时间. h

#包括unistd.h

#包含标准视频

静态void displayProcessTime(const char * msg)

{

结构TMS t;

时钟_t时钟时间;

静态长时钟=0;

如果(味精!=空)

{

printf('%s\n ',msg);

}

if (clockTick==0)

{

时钟滴答=sysconf(_ SC _ CLK _ TCK);

如果(时钟0)返回;

}

时钟时间=clock();

printf('时钟返回% LD CLOCKS _ PER _ SEC(%)。2f秒)\n ',(long)clockTime,(double)clock time/CLOCKS _ PER _ SEC);

次数(t);

printf('次返回用户CPU=% .2f系统CPU=%.2f\n ',(double)t.tms_utime/clockTick,(double)t . TMS _ stime/clock tick);

}

int main()

{

printf('CLOCKS_PER_SEC=%ld,sysconf(_SC_CLK_TCK)=%ld\n ',(long)CLOCKS_PER_SEC,sysconf(_ SC _ CLK _ TCK));

displayProcessTime(' start:');

for(int I=0;一亿我)

{

getpid();

}

printf(' \ n ');

displayProcessTime(' end:');

返回0;

}

参考

[1]http://www . run OOB . com/W3C note/CPP-time _ t . html

[2] Unix高级环境编程(第三版)

[3] Unix系统编程手册

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • Linux计划任务的命令是什么,linux 任务,linux系统中计划任务介绍
  • linux系统设置免密登录,linux免密钥登录
  • linux系统设置免密登录,linux免密钥登录,Linux下实现免密码登录(超详细)
  • Linux系统查看版本,linux系统查看系统版本
  • Linux系统查看版本,linux系统查看系统版本,Linux查看系统版本的方法汇总
  • linux操作系统的安装与配置,linux系统安装与配置教程
  • linux操作系统的安装与配置,linux系统安装与配置教程,Linux操作系统安装图文配置教程详细版
  • Linux基本网络配置命令,linux网络配置,Linux系统配置网络详细介绍
  • linux命令日志,linux系统日志怎么看
  • linux命令日志,linux系统日志怎么看,Linux系统中日志详细介绍
  • linux 服务配置文件,linux服务管理命令,Linux系统配置(服务控制)详细介绍
  • debian 命令行安装,debian安装软件方式,基于Debian的linux系统软件安装命令详解 (推荐)
  • ,,查看Linux系统是32位还是64位的方法总结
  • ,,Linux系统设置PATH环境变量(3种方法)
  • ,,Linux系统的修复模式(单用户模式)
  • 留言与评论(共有 条评论)
       
    验证码: