这篇“linux是否有计算时间的函数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux是否有计算时间的函数”文章吧。
linux有计算时间的函数,例如:可获取秒级时间差的函数time()、可获取微秒级时间差的函数gettimeofday()和settimeofday()、可获取纳秒级时间差的函数clock_gettime()等等。
1.获取时间相关函数
1.1 获取秒级时间差函数
#include <time.h>
time_t time(time_t *timer);//通过函数返回值或者timer 变量均可以获取到当前时间
time_t实际上是一个长整型,表示UTC时间(1970年1月1日0时0分0秒,Linux系统的Epoch时间)到当前系统时间的秒数级时间差
1.2 获取微秒级时间差函数
#include <sys/time.h>
#include <unistd.h>
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
struct timezone{
int tz_minuteswest;
int tz_dsttime;
};
//函数执行成功返回0,失败返回-1. 其中timezone 是时区相关的结构体
int gettimeofday(struct timeval *tv, struct timezone *tz);
//用来设置制定的时间和时区信息
int settimeofday(const struct timeval *tv, const struct timezone *gz);
1.3获取纳秒级时间差函数
#include <time.h>
struct timespec{
time_t tv_sec; //s
long tv_nsec; //ns
};
int clock_gettime(clockid_t clk_id, struct timespec* tp);
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_t转换成struct tm结构体常用的函数如下:
#include <time.h>
struct tm* gmtime(const time_t* timep);
struct tm*localtime(const time_t* timep);
gmtime() 和localtime() 函数可以将time_t 数据格式转化成tm格式的类型。区别是gmtime()转换的结果是GMT(中央时区)对应的信息,而localtime() 函数转换的结果是当前所在时区的信息。
2.2将time_t转换成我们习惯性使用的时间和日期字符串
对应转换函数如下:
#include <time.h>
char* ctime(time_t* timep);
2.3 将struct tm 转换成 time_t
对应函数如下:
#include <time.h>
time_t mktime(struct tm *p_tm);
2.4将struct tm转换成我们习惯性使用的时间和日期字符串
对应函数如下:
#include <time.h>
char *asctime(const struct tm *p_tm); //习惯性字符串 Thu Dec 9 07:13:35 2021
2.5 将时间字符串转换成 struct tm格式
char *strptime(const char *s, const char *format, struct tm *tm);
2.6 将struct tm 按照指定的format格式转化成字符串
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/time.h>
int main(int argc, char *argv[])
{
char *pstr = NULL;
struct tm *ptm = NULL;
printf("************** 使用ctime获取时间time_t **************\n");
time_t times = 0;
time(×);
printf("time_t:%ld\n\n", times);
printf("************** 使用ctime转换time_t成我们习惯性使用的时间和日期字符串 **************\n");
pstr = ctime(×);
printf("ctime:%s\n", pstr);
printf("************** 使用gmtime转换time_t成struct tm 时间和日期**************\n");
ptm = gmtime(×);
printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);
printf("year: wday:%d yday:%d isdst:%d\n\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst);
printf("************** 使用asctime转换struct tm成我们习惯性使用的时间和日期字符串**************\n");
pstr = asctime(ptm);
printf("asctime:%s\n\n", pstr);
printf("************** 使用localtime转换time_t成struct tm 时间和日期**************\n");
ptm = localtime(×);
printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);
printf("year: wday:%d yday:%d isdst:%d\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst);
pstr = asctime(ptm);
printf("asctime:%s\n\n", pstr);
printf("************** 使用gettimeofday获取微秒级的时间**************\n");
struct timeval tv;
struct timezone tz;
gettimeofday(&tv, &tz);
ptm = localtime(&tv.tv_sec);
printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);
printf("year: wday:%d yday:%d isdst:%d\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst);
printf("tv_usec:%ld\n\n", tv.tv_usec);
printf("************** 使用clock_gettime获取纳秒级的时间**************\n");
struct timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
ptm = localtime(&tp.tv_sec);
printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);
printf("year: wday:%d yday:%d isdst:%d\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst);
printf("tp.tv_nsec:%ld\n\n", tp.tv_nsec);
return 0;
}
特定的时间字符相互转换
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", &t);
printf("**** tm_isdst: %d, tm_yday:%d, tm_wday%d,\n %d-%d-%d \n %d:%d:%d\n",
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:%ld\n", mktime(&t));
printf("asctime:%s\n", asctime(&t));
strftime(pstr, sizeof(pstr), "%Y-%m-%d %H:%M:%S", &t);
printf("pstr:%s\n", pstr);
}
int time_to_str(void)
{
char pstr[128] = {0};
struct tm t = {
.tm_sec = 56,
.tm_min = 34,
.tm_hour = 12,
.tm_mday = 23,
.tm_mon = 4-1,
.tm_year = 2021-1900,
.tm_wday = 5,
.tm_yday = 113,
.tm_isdst = 0,
};
strftime(pstr, sizeof(pstr), "%Y-%m-%d %H:%M:%S", &t);
printf("pstr:%s\n", 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 < 0 && cnt < 3)
{
ret = clock_gettime(CLOCK_MONOTONIC, &now); //获取失败重试,最大执行3次
cnt++;
}
time = now.tv_sec * 1000 + now.tv_nsec / (1000000);
return time;
}
以上就是关于“linux是否有计算时间的函数”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网服务器栏目。