时间的获取是我们日常工作中经常遇到的。下面文章主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。