您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > linux下的时间转换函数
linux下的时间函数我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。time_t这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构structtimeval,它精确到微妙。structtimeval{longtv_sec;/*秒*/longtv_usec;/*微秒*/};而直接存储年月日的是一个结构:structtm{inttm_sec;/*秒,正常范围0-59,但允许至61*/inttm_min;/*分钟,0-59*/inttm_hour;/*小时,0-23*/inttm_mday;/*日,即一个月中的第几天,1-31*/inttm_mon;/*月,从一月算起,0-11*/inttm_year;/*年,从1900至今已经多少年*/inttm_wday;/*星期,一周中的第几天,从星期日算起,0-6*/inttm_yday;/*从今年1月1日到目前的天数,范围0-365*/inttm_isdst;/*日光节约时间的旗标*/};需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2008年,月份从0开始的,0表示一月,星期也是从0开始的,0表示星期日,1表示星期一。下面介绍一下我们常用的时间函数:#includetime.hchar*asctime(conststructtm*timeptr);将结构中的信息转换为真实世界的时间,以字符串的形式显示char*ctime(consttime_t*timep);将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样doubledifftime(time_ttime1,time_ttime2);返回两个时间相差的秒数intgettimeofday(structtimeval*tv,structtimezone*tz);返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用structtm*gmtime(consttime_t*timep);将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个structtm结构指针stucttm*localtime(consttime_t*timep);和gmtime类似,但是它是经过时区转换的时间。time_tmktime(structtm*timeptr);将structtm结构的时间转换为从1970年至今的秒数time_ttime(time_t*t);取得从1970年1月1日至今的秒数。上面是简单的介绍,下面通过实战来看看这些函数的用法:下载:gettime1.c1./*gettime1.c*/2.#includetime.h3.4.intmain()5.{6.time_ttimep;7.8.time(&timep);/*获取time_t类型的当前时间*/9./*用gmtime将time_t类型的时间转换为structtm类型的时间按,10.然后再用asctime转换为我们常见的格式FriJan1117:25:24200811.*/12.printf(%s,asctime(gmtime(&timep)));13.return0;14.}编译并运行:$gcc-ogettime1gettime1.c$./gettime1FriJan1117:04:082008下面是直接把time_t类型的转换为我们常见的格式:下载:gettime2.c1./*gettime2.c*/2.#includetime.h3.4.intmain()5.{6.time_ttimep;7.8.time(&timep);/*获取time_t类型当前时间*/9./*转换为常见的字符串:FriJan1117:04:082008*/10.printf(%s,ctime(&timep));11.return0;12.}编译并运行:$gcc-ogettime2gettime2.c$./gettime2SatJan1201:25:292008我看了一本书上面说的这两个例子如果先后执行的话,两个的结果除了秒上有差别之外(执行程序需要时间),应该是一样的,可是我这里执行却发现差了很长时间按,一个是周五,一个是周六,后来我用date命令执行了一遍$date六1月1201:25:19CST2008我发现date和gettime2比较一致,我估计可能gettime1并没有经过时区的转换,它们是有差别的。下载:gettime3.c1./*gettime3.c*/2.#includetime.h3.4.intmain()5.{6.char*wday[]={Sun,Mon,Tue,Wed,Thu,Fri,Sat};7.time_ttimep;8.structtm*p;9.10.time(&timep);/*获得time_t结构的时间,UTC时间*/11.p=gmtime(&timep);/*转换为structtm结构的UTC时间*/12.printf(%d/%d/%d,1900+p-tm_year,1+p-tm_mon,p-tm_mday);13.printf(%s%d:%d:%d/n,wday[p-tm_wday],p-tm_hour,14.p-tm_min,p-tm_sec);15.return0;16.}编译并运行:$gcc-ogettime3gettime3.c$./gettime32008/1/11Fri17:42:54从这个时间结果上来看,它和gettime1保持一致。下载:gettime4.c1./*gettime4.c*/2.#includetime.h3.4.intmain()5.{6.char*wday[]={Sun,Mon,Tue,Wed,Thu,Fri,Sat};7.time_ttimep;8.structtm*p;9.10.time(&timep);/*获得time_t结构的时间,UTC时间*/11.p=localtime(&timep);/*转换为structtm结构的当地时间*/12.printf(%d/%d/%d,1900+p-tm_year,1+p-tm_mon,p-tm_mday);13.printf(%s%d:%d:%d/n,wday[p-tm_wday],p-tm_hour,p-tm_min,p-tm_sec);14.return0;15.}编译并运行:$gcc-ogettime4gettime4.c$./gettime42008/1/12Sat1:49:29从上面的结果我们可以这样说:time,gmtime,asctime所表示的时间都是UTC时间,只是数据类型不一样,而localtime,ctime所表示的时间都是经过时区转换后的时间,它和你用系统命令date所表示的CST时间应该保持一致。下载:gettime5.c1./*gettime5.c*/2.#includetime.h3.4.intmain()5.{6.time_ttimep;7.structtm*p;8.9.time(&timep);/*当前time_t类型UTC时间*/10.printf(time():%d/n,timep);11.p=localtime(&timep);/*转换为本地的tm结构的时间按*/12.timep=mktime(p);/*重新转换为time_t类型的UTC时间,这里有一个时区的转换*/13.printf(time()-localtime()-mktime():%d/n,timep);14.return0;15.}编译并运行:$gcc-ogettime5gettime5.c$./gettime5time():1200074913time()-localtime()-mktime():1200074913这里面把UTC时间按转换为本地时间,然后再把本地时间转换为UTC时间,它们转换的结果保持一致。下载:gettime6.c1./*gettime6.c*/2.#includetime.h3.4.intmain()5.{6.time_ttimep;7.structtm*p;8.9.time(&timep);/*得到time_t类型的UTC时间*/10.printf(time():%d/n,timep);11.p=gmtime(&timep);/*得到tm结构的UTC时间*/12.timep=mktime(p);/*转换,这里会有时区的转换*/13.printf(time()-gmtime()-mktime():%d/n,timep);14.return0;15.}编译并运行:$gcc-ogettime6gettime6.c$./gettime6time():1200075192time()-gmtime()-mktime():1200046392从这里面我们可以看出,转换后时间不一致了,计算一下,整整差了8个小时((1200075192-1200046392)/3600=8),说明mktime会把本地时间转换为UTC时间,这里面本来就是UTC时间,于是再弄个时区转换,结果差了8个小时,用的时候应该注意。函数分类:1.设置时间:settimeofday,tzset2.获取时间:time,ftime,gettimeofday3.时间格式转换:mktime,strftime;gmtime,localtime;asctime,ctime4.其他:clock,difftimeasctime:将时间和日期以字符串格式表示头文件:time.h函数定义:char*asctime(conststructtm*timeptr);说明:asctime()将函数timeptr所指的tm结构中的信息转换成现实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,返回的字符串格式为:WedJun3021:49:081993/nctime:将时间和日期以字符串格式表示头文件:time.h函数定义:char*ctime(consttime_t*timep);说明:ctime()同asctime()函数,只是输入参数为time_t.应用举例:#includestdio.h#includetime.hintmain(void){time_ttimep;time(&timep);printf(%s,ctime(&timep));printf(%s,asctime(gmtime(&timep)));return0;}运行结果:SunDec1415:30:112008SunDec1415:30:112008clock:取得进程占用CPU的大约时间头文件:time.h函数定义:clock_tclock(void);说明:clock()用来返回进程所占用CPU的大约时间.difftime:计算时间差距头文件:time.h函数定义:doubledifftime(time_ttime1,time_ttime0);说明:difftime()用来计算参数time1-time0,结果以double型精确值返回.两个参数的时间都是以1970年1月1日0时0分0秒算起的UTC时间.ftime:取得目前的时间和日期头文件:sys/timeb.h函数定义:intftime(structtimeb*tp);说明:ftime()将日前时间日期由参数tp所指的结构输出.tp结构定义如下:structtimeb{/*为从1970年1月1日至今的秒数*/time_ttime;/*为千分之一秒*/unsignedshortmillitm;/*为目前时区和Greenwich相差的时间,单位为单位*/
本文标题:linux下的时间转换函数
链接地址:https://www.777doc.com/doc-3969165 .html