LinuxUnix 时间与日期函数

xiaoxiao2021-02-28  46

       由UNIX内核提供的基本时间服务时计算自协调世界时(UTC)公元1970年1月1日00:00:00这一特定时间以来经过的秒数。这种秒数是以数据类型time_t表示的,称为日历时间。日历时间包括时间和日期。UNIX在这方面与其他操作系统的区别是:    1)以协调同一时间而非本地时间计时    2)可自动进行转换,如变换到夏令时

    3)将时间与日期作为一个量值保存

time函数

time函数返回当前时间和日期。 #include<time.h> time_t time(time_t *calptr); //返回值:若成功,返回时间值;若出错,返回-1 时间值作为函数值返回。如果参数非空,则时间值也存放在由calptr指向的单元内。时钟通过clockid_t 类型进行标识。如下图 标识符 选项 说明 CLOCK_REALTIME   实时系统时间 CLOCK_MOMOTONIC _POSIX_MONOTONIC_CLOCK 不带负跳数的实时系统时间 CLOCK_PROCESS_CPUTIME_ID _POSIX_CPUTIME 调用进程的CPU时间 CLOCK_THREAD_CPUTIME_ID _POSIX_THREAD_CPUTIME 调用线程的CPU时间 clock_gettime函数 clock_gettime函数可用于获取指定时钟的时间,返回的时间在timespec结构中,它把时间表示为秒和纳秒。 #include<sys/time.h> int clock_gettime(clockid_t clock_id, struct timespce *tsp); //返回值:若成功返回0;若出错,返回-1

       当时钟ID设置为CLOCK_REALTIME时,clock_gettime函数提供了与time函数类似的功能,不过在系统支持高精度时间值的情况下,clock_gettime可能比time函数得到更高精度的时间值。

clock_getres函数 #include<sys/time.h> int clock_getres(clockid_t clock_id, struct timespec *tsp); //返回值:若成功,返回0;若出错,返回-1

       clock_getres 函数把参数tsp指向的timespec结构初始化为与clock_id参数对应的时钟精度。例如,如果精度为1毫秒,则tv_sec字段就是0,tv_nsec字段就是1 000000。

clock_settime函数 要对特定的时钟设置时间,可以调用clock_settime函数。 int clock_settime(clockid_t clock_id, const struct timespec *tsp); //返回值:若成功,返回0;若出错,返回-1

gettimeofday函数

gettimeofday函数与time函数相比,gettimeofday提供了更高的精度(可到微妙级)。

#include<sys/time.h> int gettimeofday(struct timeval *restrict tp, void *restrict tzp); //返回值:总是返回0      tzp的唯一合法值是NULL,其他值将产生不确定结果。      gettimeofday函数以距特定时间(1970年1月1日00:00:00)的秒数的方式将当前时间存放在fp指向的timeval结构中,而该结构将当前时间表示为秒和微妙。       一旦取得这种从上述特定时间经过的描述的整型时间值后,通常要调用函数将其转换为分解的时间结构,然后调用另一个函数生成人们可读的时间和日期。两个函数localtime和gmtime将日历时间转换为分解的时间,并将这些存放在一个tm结构中。 struct tm{     int tm_sec;     int tm_min;     int tm_hour;     int tm_mday;     int tm_mon;     int tm_year;     int tm_wday;     int tm_yday;     int tm_isdst; }; localtime和gmtime函数 #include<time.h> struct tm *gmtime(const time_t *calptr); struct tm *localtime(const time_t *calptr) //两个函数的返回值:指向分解的tm结构的指针:若出错,返回NULL

       localtime 和 gmtime之间的区别是:localtime将日历时间转换成本地时间,而gmtime则将日历时间转换成协调同一时间的年、月、日、时、分、秒、周日分解结构。

mktime函数 函数mktime以本地时间的年月日作为参数,将其变换为time_t值。 #include<time.h> time_t mktime(struct tm *tmptr); //返回值:若成功,返回日历时间;若出错,返回-1 strftime函数 函数strftime时一个类似于printf的时间值函数。它非常复杂,可以通过可用的多个参数来定制产生的字符串。 #include<time.h> size_t strftime(char *restrict buf,size_t maxsize,const char *restrict format,const struct tm *restrict tmptr); size_t strftime_l(char *restrict buf,size_t maxsize,const char *restrict format,const struct tm *restrict tmptr, locale_t locale);        strftime_l允许调用者将区域指定为参数,除此之外,strftime和strftime_l 函数是相同的。strftime使用通过TZ环境变量指定的区域。       tmptr参数是要格式化的时间值,由一个指向分解时间值tm结构的指针说明。格式化结果存放在一个长度为maxsize个字符的buf数组中,如果buf长度足以存放格式化结果及一个null终止符,则该函数返回buf中存放的字符数;否则该函数返回0.       format参数控制时间值的格式。如图printf函数一样,转换说明的形式是百分号之后跟一个特定字符。format中的其他字符则按原样输出。两个连续的百分号在输出中产生一个百分号。与printf函数不同之处是,每个转换说明产生一个不同的定长输出字符串,在format字符串中没有字段宽度修饰符。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { time_t t; struct tm *tmp; char buf1[16]; char buf2[64]; time(&t); tmp=localtime(&t); if (strftime(buf1,16,"time and date:%r,%a %b %d, %Y", tmp) == 0) printf("buffer length 16 is too small \n"); else printf("%s\n",buf1); if (strftime(buf2,64,"time and date:%r,%a %b %d, %Y", tmp) == 0) printf("buffer length 64 is too small \n"); else printf("%s\n",buf2); exit(0); }
转载请注明原文地址: https://www.6miu.com/read-2627584.html

最新回复(0)