Maison  >  Article  >  Opération et maintenance  >  Linux a-t-il une fonction pour calculer le temps ?

Linux a-t-il une fonction pour calculer le temps ?

青灯夜游
青灯夜游original
2023-04-11 17:46:531568parcourir

Linux a des fonctions pour calculer le temps, telles que : la fonction time() qui peut obtenir le décalage horaire de deuxième niveau, les fonctions gettimeofday() et settimeofday() qui peuvent obtenir le décalage horaire au niveau de la microseconde, la fonction clock_gettime( ) qui peut obtenir la différence de temps au niveau de la nanoseconde, etc.

Linux a-t-il une fonction pour calculer le temps ?

L'environnement d'exploitation de ce tutoriel : système linux7.3, ordinateur Dell G3.

Ce qui suit explique les fonctions liées au temps et les fonctions liées à la conversion de l'heure sous Linux

1 Obtenez les fonctions liées au temps

1.1 Obtenez la fonction de décalage horaire de deuxième niveau

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

time_t est en fait un. Type entier long, représentant la différence de temps au niveau des secondes entre l'heure UTC (0:00:00 le 1er janvier 1970, l'heure Epoch du système Linux) et l'heure actuelle du système

1.2 Obtenez la différence de temps au niveau de la microseconde function

#include <sys/time.h>
#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);

1.3 Obtenez la fonction de différence de temps nanoseconde

#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);

2. Convertissez la fonction liée au temps

2.1 Convertissez le paramètre de temps time_t obtenu par la fonction d'acquisition de temps ci-dessus en une structure

struct tm, qui contient l'année Des champs très détaillés tels que le mois, le jour, etc. Comme indiqué ci-dessous :

#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,不确定时为负*/
};

Les fonctions couramment utilisées pour convertir time_t en structure struct tm sont les suivantes :

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

Les fonctions gmtime() et localtime() peuvent convertir le format de données time_t en type de format tm. La différence est que le résultat de la conversion par gmtime() est l'information correspondant au GMT (fuseau horaire central), tandis que le résultat de la conversion par la fonction localtime() est l'information du fuseau horaire actuel.

2.2 Convertir time_t en chaînes d'heure et de date que nous utilisons habituellement

La fonction de conversion correspondante est la suivante :

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

2.3 Convertir struct tm en time_t

La fonction correspondante est la suivante :

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

2.4 Convertir struct tm en chaînes d'heure et de date que nous utilisons habituellement

Les fonctions correspondantes sont les suivantes :

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

2.5 Convertir la chaîne d'heure au format struct tm

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

2.6 Convertir struct tm selon le format de format spécifié String

/**************************************
** 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. Exemple

#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(&times);
	printf("time_t:%ld\n\n", times);
	
	printf("************** 使用ctime转换time_t成我们习惯性使用的时间和日期字符串 **************\n");
	pstr = ctime(&times);
	printf("ctime:%s\n", pstr);
	
	printf("************** 使用gmtime转换time_t成struct tm 时间和日期**************\n");
	ptm = gmtime(&times);
	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(&times);
	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;
}

Conversion de caractères temporels spécifiques

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,    /* 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", &t);
    printf("pstr:%s\n", pstr);
}

Si vous souhaitez obtenir l'heure à partir du démarrage du système, même si l'utilisateur modifie l'heure, elle ne sera pas affectée, en millisecondes. , par exemple :

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;
}

Recommandations associées : "Tutoriel vidéo Linux"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Linux a-t-il un pare-feu ?Article suivant:Linux a-t-il un pare-feu ?