Linux下用C获取当前时间
Linux下用C获取当前时间,具体如下:
代码(可以把clock_gettime换成time(NULL))
voidgetNowTime() { timespectime; clock_gettime(CLOCK_REALTIME,&time);//获取相对于1970到现在的秒数 tmnowTime; localtime_r(&time.tv_sec,&nowtime); charcurrent[1024]; sprintf(current,"%04d%02d%02d%02d:%02d:%02d",nowTime.tm_year+1900,nowTime.tm_mon,nowTime.tm_mday, nowTime.tm_hour,nowTime.tm_min,nowTime.tm_sec); }
分析:
clock_gettime()
函数"clock_gettime"是基于LinuxC语言的时间函数,他可以用于计算精度和纳秒。
语法:
#include<time.h> intclock_gettime(clockid_tclk_id,structtimespec*tp);
参数:
clk_id:检索和设置的clk_id指定的时钟时间。
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-10:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变
- CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
- CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
- CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
structtimespec { time_ttv_sec;/*秒*/ longtv_nsec;/*纳秒*/ };
localtime()
localtime是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间.
语法
说明:此函数获得的tm结构体的时间是日历时间。
用法:structtm*localtime(consttime_t*clock);
返回值:返回指向tm结构体的指针.tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体.
例1:
#include<stdio.h> #include<stddef.h> #include<time.h> intmain(void) { time_ttimer;//time_t就是longint类型 structtm*tblock; timer=time(NULL); tblock=localtime(&timer); printf("Localtimeis:%s\n",asctime(tblock)); return0; }
执行结果:
Localtimeis:MonFeb1611:29:262009
例2:
上面的例子用了asctime函数,下面这个例子不使用这个函数一样能获取系统当前时间。需要注意的是年份加上1900,月份加上1。
#include<time.h> #include<stdio.h> intmain() { structtm*t; time_ttt; time(&tt); t=localtime(&tt); printf("%4d年%02d月%02d日%02d:%02d:%02d\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); return0; }
localtime()与localtime_r()的区别
localtime():
#include<cstdlib> #include<iostream> #include<time.h> #include<stdio.h> usingnamespacestd; intmain(intargc,char*argv[]) { time_ttNow=time(NULL); time_ttEnd=tNow+1800; //注意下面两行的区别 structtm*ptm=localtime(&tNow); structtm*ptmEnd=localtime(&tEnd); charszTmp[50]={0}; strftime(szTmp,50,"%H:%M:%S",ptm); charszEnd[50]={0}; strftime(szEnd,50,"%H:%M:%S",ptmEnd); printf("%s/n",szTmp); printf("%s/n",szEnd); system("PAUSE"); returnEXIT_SUCCESS; }
最后出来的结果是:
21:18:39
21:18:39
和最初想法不一致。
查阅localtime的文档,发现这段话:
Thisstructureisstaticallyallocatedandsharedbythefunctionsgmtimeandlocaltime.Eachtimeeitheroneofthesefunctionsiscalledthecontentofthisstructureisoverwritten.
也就是说每次只能同时使用localtime()函数一次,要不就会被重写!
Thelocaltime()functionneednotbereentrant.Afunctionthatisnotrequiredtobereentrantisnotrequiredtobethread-safe.
因此localtime()不是可重入的。同时libc里提供了一个可重入版的函数localtime_r();
Unlikelocaltime(),thereentrantversionisnotrequiredtosettzname。
修改程序:(localtime_r())
#include<cstdlib> #include<iostream> #include<time.h> #include<stdio.h> usingnamespacestd; intmain(intargc,char*argv[]) { time_ttNow=time(NULL); time_ttEnd=tNow+1800; //在这里修改程序 //structtm*ptm=localtime(&tNow); //structtm*ptmEnd=localtime(&tEnd); structtmptm={0}; structtmptmEnd={0}; localtime_r(&tNow,&ptm); localtime_r(&tEnd,&ptmEnd); charszTmp[50]={0}; strftime(szTmp,50,"%H:%M:%S",&ptm); charszEnd[50]={0}; strftime(szEnd,50,"%H:%M:%S",&ptmEnd); printf("%s/n",szTmp); printf("%s/n",szEnd); system("PAUSE"); returnEXIT_SUCCESS; }
最后出来的结果是:
10:29:06
10:59:06
tm
structtm{ inttm_sec;/*秒–取值区间为[0,59]*/ inttm_min;/*分-取值区间为[0,59]*/ inttm_hour;/*时-取值区间为[0,23]*/ inttm_mday;/*一个月中的日期-取值区间为[1,31]*/ inttm_mon;/*月份(从一月开始,0代表一月)-取值区间为[0,11]*/ inttm_year;/*年份,其值等于实际年份减去1900*/ inttm_wday;/*星期–取值区间为[0,6],其中0代表星期天,1代表星期一*/ inttm_yday;/*从每年1月1日开始的天数–取值区间[0,365],其中0代表1月1日*/ inttm_isdst;/*夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0*/ };
time函数
返回:1970-1-1,00:00:00以来经过的秒数
原型:time_ttime(time_t*calptr)
结果可以通过返回值,也可以通过参数得到,见实例
头文件<time.h>
返回值:
成功:秒数,从1970-1-1,00:00:00可以当成整型输出或用于其它函数
失败:-1
例:
time_tnow; time(&now);//等同于now=time(NULL) printf("nowtimeis%d\n",now);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。