linux有计算时间的函数吗

linux有计算时间的函数,例如:可获取秒级时间差的函数time()、可获取微秒级时间差的函数gettimeofday()和settimeofday()、可获取纳秒级时间差的函数clock_gettime()等等。

linux有计算时间的函数吗

本教程操作环境:linux7.3系统、Dell G3电脑。

下面讲解的是linux中 时间相关的函数和将时间转换相关函数

1.获取时间相关函数

1.1 获取秒级时间差函数

#include <time.h> time_t time(time_t *timer);//通过函数返回值或者timer 变量均可以获取到当前时间</time.h>

time_t实际上是一个长整型,表示UTC时间(1970年1月1日0时0分0秒,Linux系统的Epoch时间)到当前系统时间的秒数级时间差

1.2 获取微秒级时间差函数

#include <sys> #include <unistd.h> struct timeval {     time_t       tv_sec;     /* seconds */     suseconds_t tv_usec;    /* microseconds */ };  struct timezone{       int tz_minuteswest; /*miniutes west of Greenwich*/       int tz_dsttime; /*type of DST correction*/   };  //函数执行成功返回0,失败返回-1. 其中timezone 是时区相关的结构体 int gettimeofday(struct timeval *tv, struct timezone *tz);  //用来设置制定的时间和时区信息 int settimeofday(const struct timeval *tv, const struct timezone *gz);</unistd.h></sys>

1.3获取纳秒级时间差函数

#include <time.h>  /* 其中clk_id 用来制定对应的时钟类型,不同的类型可以用来获取不同的时间值,具体有四种: CLOCK_REALTIME: 			系统实时时间,从UTC开始计时,若时间被用户更改计数时间相应改变; CLOCK_MONOTONIC:			从系统启动开始计时,即使用户更改时间也没有影响; CLOCK_PROCESS_CPUTIME_ID:	本进程开始到执行到当前程序系统CPU花费的时间; CLOCK_THREAD_CPUTIME_ID:	本线程开始到执行到当前程序系统CPU花费的时间  */  struct timespec{     time_t tv_sec;    //s     long tv_nsec;    //ns };  int clock_gettime(clockid_t clk_id, struct timespec* tp);</time.h>

2.转换时间相关函数

2.1将上述获取时间函数获取到的时间参数time_t转换为结构体

struct tm,该结构体包含年月日等非常详细的域。下如所示:

#include <time.h>   struct 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代表星期1,以此类推     int tm_yday;   //日期;0代表1月1日     int tm_isdst;   //夏令时标识符;使用夏令时为正,不使用t为0,不确定时为负*/ };</time.h>

将time_t转换成struct tm结构体常用的函数如下:

#include <time.h>  struct tm* gmtime(const time_t* timep); struct tm*localtime(const time_t* timep);</time.h>

gmtime() 和localtime() 函数可以将time_t 数据格式转化成tm格式的类型。区别是gmtime()转换的结果是GMT(中央时区)对应的信息,而localtime() 函数转换的结果是当前所在时区的信息。

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

对应转换函数如下:

#include <time.h> char* ctime(time_t* timep);</time.h>

2.3 将struct tm 转换成 time_t

对应函数如下:

#include <time.h> time_t mktime(struct tm *p_tm);</time.h>

2.4将struct tm转换成我们习惯性使用的时间和日期字符串

对应函数如下:

#include <time.h> char *asctime(const struct tm *p_tm); //习惯性字符串 Thu Dec  9 07:13:35 2021</time.h>

2.5 将时间字符串转换成 struct tm格式

/************************************** ** description: 将struct tm 按照指定的format格式转化成字符串 ** parameter: 		** *s : 需要被转换的时间字符串 		** *format:时间字符串的格式 		** *tm:转换后的tm时间 **************************************/ char *strptime(const char *s, const char *format, struct tm *tm);

2.6 将struct tm 按照指定的format格式转化成字符串

/************************************** ** description: 将struct tm 按照指定的format格式转化成字符串 ** parameter: 		** *s : 生成的时间字符串 		** max: 字符串最大字符数(即最大可生成的字符数量) 		** *format:生成的字符串格式 		** *tm:需要被转换的tm时间 **************************************/ size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);

3.举例

#include <stdio.h> #include <string.h> #include <unistd.h> #include <time.h> #include <sys>  int main(int argc, char *argv[]) {	 	char *pstr = NULL; 	struct tm *ptm = NULL;  	printf("************** 使用ctime获取时间time_t **************n"); 	time_t times = 0; 	time(&amp;times); 	printf("time_t:%ldnn", times); 	 	printf("************** 使用ctime转换time_t成我们习惯性使用的时间和日期字符串 **************n"); 	pstr = ctime(&amp;times); 	printf("ctime:%sn", pstr); 	 	printf("************** 使用gmtime转换time_t成struct tm 时间和日期**************n"); 	ptm = gmtime(&amp;times); 	printf("time : %d:%d:%dn", ptm-&gt;tm_hour,  ptm-&gt;tm_min,  ptm-&gt;tm_sec); 	printf("date: %d:%d:%dn", ptm-&gt;tm_year+1900, ptm-&gt;tm_mon+1, ptm-&gt;tm_mday); 	printf("year: wday:%d yday:%d isdst:%dnn", ptm-&gt;tm_wday, ptm-&gt;tm_yday, ptm-&gt;tm_isdst); 	 	printf("************** 使用asctime转换struct tm成我们习惯性使用的时间和日期字符串**************n"); 	pstr = asctime(ptm); 	printf("asctime:%snn", pstr); 	 	printf("************** 使用localtime转换time_t成struct tm 时间和日期**************n"); 	ptm = localtime(&amp;times); 	printf("time : %d:%d:%dn", ptm-&gt;tm_hour,  ptm-&gt;tm_min,  ptm-&gt;tm_sec); 	printf("date: %d:%d:%dn", ptm-&gt;tm_year+1900, ptm-&gt;tm_mon+1, ptm-&gt;tm_mday); 	printf("year: wday:%d yday:%d isdst:%dn", ptm-&gt;tm_wday, ptm-&gt;tm_yday, ptm-&gt;tm_isdst);  	pstr = asctime(ptm); 	printf("asctime:%snn", pstr);  	printf("************** 使用gettimeofday获取微秒级的时间**************n"); 	struct timeval tv; 	struct timezone tz; 	gettimeofday(&amp;tv, &amp;tz); 	ptm = localtime(&amp;tv.tv_sec); 	printf("time : %d:%d:%dn", ptm-&gt;tm_hour,  ptm-&gt;tm_min,  ptm-&gt;tm_sec); 	printf("date: %d:%d:%dn", ptm-&gt;tm_year+1900, ptm-&gt;tm_mon+1, ptm-&gt;tm_mday); 	printf("year: wday:%d yday:%d isdst:%dn", ptm-&gt;tm_wday, ptm-&gt;tm_yday, ptm-&gt;tm_isdst); 	printf("tv_usec:%ldnn", tv.tv_usec); 	 	printf("************** 使用clock_gettime获取纳秒级的时间**************n"); 	struct timespec tp; 	clock_gettime(CLOCK_REALTIME, &amp;tp); 	ptm = localtime(&amp;tp.tv_sec); 	printf("time : %d:%d:%dn", ptm-&gt;tm_hour,  ptm-&gt;tm_min,  ptm-&gt;tm_sec); 	printf("date: %d:%d:%dn", ptm-&gt;tm_year+1900, ptm-&gt;tm_mon+1, ptm-&gt;tm_mday); 	printf("year: wday:%d yday:%d isdst:%dn", ptm-&gt;tm_wday, ptm-&gt;tm_yday, ptm-&gt;tm_isdst);	 	printf("tp.tv_nsec:%ldnn", tp.tv_nsec); 	return 0; }</sys></time.h></unistd.h></string.h></stdio.h>

特定的时间字符相互转换

int str_to_time(void) { 	char pstr[128] = {0};     struct tm t;     strptime("2021-04-23 12:34:56", "%Y-%m-%d %H:%M:%S", &amp;t); 	     printf("**** tm_isdst: %d, tm_yday:%d, tm_wday%d,n %d-%d-%d n %d:%d:%dn",      t.tm_isdst, t.tm_yday, t.tm_wday, t.tm_year+1900, t.tm_mon+1, t.tm_mday,     t.tm_hour, t.tm_min, t.tm_sec);     printf("mktime ts:%ldn", mktime(&amp;t)); 	printf("asctime:%sn", asctime(&amp;t)); 	 	strftime(pstr, sizeof(pstr), "%Y-%m-%d %H:%M:%S", &amp;t);     printf("pstr:%sn", pstr); }  int time_to_str(void) { 	char pstr[128] = {0};     struct tm t = {                .tm_sec = 56,    /* Seconds (0-60) */                .tm_min = 34,    /* Minutes (0-59) */                .tm_hour = 12,   /* Hours (0-23) */                .tm_mday = 23,   /* Day of the month (1-31) */                .tm_mon = 4-1,     /* Month (0-11) */                .tm_year = 2021-1900,   /* Year - 1900 */                .tm_wday = 5,     /* Day of the week (0-6, Sunday = 0) */                .tm_yday = 113,   /* Day in the year (0-365, 1 Jan = 0) */                .tm_isdst = 0,    /* Daylight saving time */            };     strftime(pstr, sizeof(pstr), "%Y-%m-%d %H:%M:%S", &amp;t);     printf("pstr:%sn", pstr); }

若想获取从系统启动开始计时,即使用户更改时间也没有影响的时间,单位毫秒,举例如下:

unsigned long long clock_systick_get(void) {     int ret = -1;     unsigned long long time;     int cnt = 0;     struct timespec  now = {0, 0};      while (ret <p>相关推荐:《<a href="http://www.php.cn/course/list/33.html" target="_blank">Linux视频教程</a>》<br></p>

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享