linux中的时间函数

合集下载

linux延时函数

linux延时函数

linux延时函数
Linux内核中包含了一些延时函数,他们被应用在很多情况下,用于
控制系统内部多个线程与进程执行的先后顺序,通常被用来保证数据的正
确性和及时的处理步骤。

Linux下常用的延时函数有:
1、usleep:usleep函数会让调用进程暂停指定的时间,其参数是指
定的暂停时间,以微秒为单位,当暂停时间到达后,就会激活当前的进程。

2、nanosleep:nanosleep函数的参数也是指定的暂停时间,但是精
度比usleep函数更精确,它是以纳秒为单位设定暂停时间,暂停时间到
达后,也会激活当前的进程。

3、sleep:sleep函数被用来暂停调用进程,它的参数以秒为单位,
指定了暂停时间,当暂停时间到达后,就会唤醒当前进程。

4、schedule_timeout():schedule_timeout()函数会指定一个超时
时间,当计时器到达设定时间时,就会激活当前的进程,继续执行后续的
操作。

以上就是Linux常用的延时函数,它们可以精确控制进程执行,保证
数据的正确性和及时处理,它们为Linux内核的设计和提供了一定的便利。

linux中的时间函数

linux中的时间函数
tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday); printf(“time: %02d:%02d:%02d\n”,
tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); exit(0); } 当我们运行这个程序时,我们会得到更可读的时间与日期值: $ ./gmtime; date Raw time is 1044696004 gmtime gives: date: 103/02/08 time: 09:20:04 Sat Feb 8 09:20:04 GMT 2003 工作原理 这个程序调用 time 函数得到一个底层的时间值,然后调用 gmtime 将其转换为一个具有时 间 与日期值的结构。程序会使用 printf 函数打印输出。严格来讲,我们不应使用这种方式打印原始 时间,因为并不能保证在所有的系统他都是一个 long 类 型。在 gmtime 函数之后,我们立即运行 date 命令来比较其输出。 然而,在这里我们一个小问题。如果我们在一个不使用格林尼治时间的时区运行这个程序,或 者是 我们本地的白天存储时间是有效的(问题?),我们就会注意到这个时间并不正确。这是因为 gmtime 是使用 GMT 返回时间。Linux 与 Unix 系统这样 做,从而世界上的程序与系统都是同步的。 不同时区在同一时间创建的文件会显示出具有相同的创建时间。要查看本地时间,我们需要使用 localtime 函数 来代替。 #include <time.h> struct tm *localtime(const time_t *timeval);
转义符
描述
%a
简写的星期名

linux 系统时间函数

linux 系统时间函数

linux 系统时间函数
Linux系统提供了许多用于操作系统时间和日期的函数。

以下是一些常见的函数。

1. time_t time(time_t *t):返回当前时间的时间戳,以自1970年1月1日00:00:00 UTC以来的秒数为单位。

如果t不为空,则时间戳也被存储在t指向的位置。

2. struct tm *localtime(const time_t *timep):将给定的时间戳转换为本地时间。

返回一个指向tm结构的指针,其中包含本地时间的小时,分钟,秒等。

3. struct tm *gmtime(const time_t *timep):将给定的时间戳转换为GMT时间(格林威治标准时间)。

返回一个指向tm结构的指针,其中包含GMT时间的小时,分钟,秒等。

4. time_t mktime(struct tm *tm):将给定的tm结构(其中包含小时,分钟,秒等)转换为对应的时间戳。

5. char *ctime(const time_t *timep):将给定的时间戳转换为一个字符串,表示为"Day Mon dd hh:mm:ss yyyy"的格式。

6. int gettimeofday(struct timeval *tv, struct timezone *tz):获取当前时间和时区。

返回一个表示微秒级别的时间戳,并将tv指向的结构中的秒数和微秒
数及tz指向的结构中的本地时区信息填充。

linux几种时间函数总结

linux几种时间函数总结

linux⼏种时间函数总结⼀、linux时间函数总结 最近的⼯作中⽤到的时间函数⽐较频繁,今天抽时间总结⼀下,在linux下,常⽤的获取时间的函数有如下⼏个: asctime, ctime, gmtime, localtime, gettimeofday , mktime, asctime_r, ctime_r, gmtime_r, localtime_r⼆、常⽤的结构体(1)struct tm ;1struct tm {2int tm_sec; /* seconds */3int tm_min; /* minutes */4int tm_hour; /* hours */5int tm_mday; /* day of the month */6int tm_mon; /* month */7int tm_year; /* year */8int tm_wday; /* day of the week */9int tm_yday; /* day in the year */10int tm_isdst; /* daylight saving time */11 };1213//int tm_sec 代表⽬前秒数,正常范围为0-59,但允许⾄61秒14//int tm_min 代表⽬前分数,范围0-5915//int tm_hour 从午夜算起的时数,范围为0-2316//int tm_mday ⽬前⽉份的⽇数,范围01-3117//int tm_mon 代表⽬前⽉份,从⼀⽉算起,范围从0-1118//int tm_year 从1900 年算起⾄今的年数19//int tm_wday ⼀星期的⽇数,从星期⼀算起,范围为0-620//int tm_yday 从今年1⽉1⽇算起⾄今的天数,范围为0-36521//int tm_isdst ⽇光节约时间的旗标(2)struct timeval,struct timezone;1struct timeval {2 time_t tv_sec; /* seconds (秒)*/3 suseconds_t tv_usec; /* microseconds(微秒) */4 };5struct timezone {6int tz_minuteswest; /* minutes west of Greenwich */7int tz_dsttime; /* type of DST correction */8 };9int tz_minuteswest; /* 格林威治时间往西⽅的时差 */10int tz_dsttime; /* 时间的修正⽅式*/三、时间函数介绍:(1)time() 函数获取当前时间1 SYNOPSIS2 #include <time.h>34 time_t time(time_t *t);56 DESCRIPTION7 time() returns the time as the number of seconds since the Epoch, 1970-01-0100:00:00 +0000 (UTC).8//此函数会返回从公元1970年1⽉1⽇的UTC时间从0时0分0秒算起到现在所经过的秒数。

Linux下时间相关的函数

Linux下时间相关的函数

1. Linux下常用时间类型Linux下常用时间类型有四种:time_t、struct tm、struct timeval、struct timespec 、struct timespec 、struct timeval1.1 time_t时间类型time_t类型在time.h中定义:#ifndef __TIME_T#define __TIME_Ttypedef long time_t;#endif可见,time_t实际是一个长整型。

其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数。

由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC)。

为了能够表示更久远的时间,可用64位或更长的整形数来保存日历时间,这里不作详述。

使用time()函数获取当前时间的time_t值,使用ctime()函数将time_t转为当地时间字符串。

备注:UTC时间有时也称为GMT时间,其实UTC和GMT两者几乎是同一概念。

它们都是指格林尼治标准时间,只不过UTC的称呼更为正式一点。

两者区别在于前者是天文上的概念,而后者是基于一个原子钟。

1.2 struct tm时间类型tm结构在time.h中定义:#ifndef _TM_DEFINEDstruct tm{int tm_sec; /*秒- 取值区间为[0, 59]*/int tm_min; /*分- 取值区间为[0, 59]*/int tm_hour; /*时- 取值区间为[0, 23]*/int tm_mday; /*日- 取值区间为[1, 31]*/int tm_mon; /*月份- 取值区间为[0, 11]*/int tm_year; /*年份- 其值为1900年至今年数*/int tm_wday; /*星期- 取值区间[0, 6],0代表星期天,1代表星期1,以此类推*/int tm_yday; /*从每年的1月1日开始的天数-取值区间为[0, 365],0代表1月1日*/int tm_isdst; /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/};#define _TM_DEFINED#endifANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。

linux时间函数

linux时间函数

linux时间函数
Linux中的时间函数是指用于获取系统时间和操作时间的函数,它们是Linux系统中非常重要的一部分。

系统时间是指当前时刻,操作时间则是指进程的运行时间。

Linux中最常用的时间函数是time()函数,它可以获取从1970年1月1日UTC开始到现在的秒数,通常被称为Unix时间戳。

另外,还有gettimeofday()函数,可以获取更精细的时间信息,例如微秒和毫秒级别的时间。

除了获取时间外,Linux中还有一些其他的时间函数。

例如,clock()函数可以返回程序执行的CPU时间,而ctime()函数则可以将Unix时间戳转换为本地时间字符串。

在Linux中,时间函数是非常常用的,无论是在系统级编程还是在应用程序开发中都有广泛的应用。

因此,对于Linux开发者来说,熟练掌握各种时间函数的使用是非常重要的。

- 1 -。

linux时间函数

linux时间函数

linux时间函数1.clock函数clock_t start,end;start = clock();end = clock();(end - start)/CLOCKS_PER_SEC;2.times函数struct tms start_tms,end_tms;clock_t start,end;start = times(&amp;start_tms);end = times(&amp;end_tms);long clktck = sysconf(_SC_CLK_TCK);(end - start) /clktck;struct tms {clock_t tms_utime;clock_t tms_stime;clock_t tms_cutime;clock_t tms_cstime;}3.int clock_gettime(clockid_t clk_id,struct timespec *tp); struct timespec start_tp,end_tp;clock_gettime(CLOCK_REALTIME,&amp;start_tp)clock_gettime(CLOCK_REALTIME,&amp;end_tp);struct timespec {time_t tv_sec;time_t tv_nsec;}4.gettimeofday()int gettimeofday(struct timeval *tv,struct timezone *tz); struct timeval start_tv,end_tv;gettimeofday(&amp;start_tv,NULL);gettimeofday(&amp;end_tv,NULL);struct timeval {time_t tv_sec;suseconds_t tv_usec;}一)ANSI clock函数1)概述:clock 函数的返回值类型是clock_t,它除以CLOCKS_PER_SEC来得出时间,一般用两次clock函数来计算进程自身运行的时间.ANSI clock有三个问题:1)如果超过一个小时,将要导致溢出.2)函数clock没有考虑CPU被子进程使用的情况.3)也不能区分用户空间和内核空间.所以clock函数在linux系统上变得没有意义.2)测试编写test1.c程序,测试采用clock函数的输出与time程序的区别.vi test1.c#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;time.h&gt;int main( void ){long i=1000L;clock_t start, finish;double duration;printf( "Time to do %ld empty loops is ", i );start = clock();while (--i){system("cd");}finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;printf( "%f seconds\n", duration );return 0;}gcc test1.c -o test1time ./test1Time to do 1000 empty loops is 0.180000 secondsreal 0m3.492suser 0m0.512ssys 0m2.972s3)总结:(1)程序调用system("cd");,这里主要是系统模式子进程的消耗,test1程序不能体现这一点.(2)0.180000 seconds秒的消耗是两次clock()函数调用除以CLOCKS_PER_SEC.(3)clock()函数返回值是一个相对时间,而不是绝对时间.(4)CLOCKS_PER_SEC是系统定义的宏,由GNU标准库定义为1000000.核心函数:clock_t start,end;double duration;start = clock();..............end = clock();duration = (double) (end -start)/CLOCKS_PER_SEC;//CLOCKS_PER_SEC是系统定义的宏,由GNU标准库定义为1000000二)times()时间函数1)概述:原型如下:clock_t times(struct tms *buf);tms结构如下:struct tms {clock_t tms_utime;clock_t tms_stime;clock_t tms_cutime;clock_t tms_cstime;}注释:tms_utime记录的是进程执行用户代码的时间.tms_stime记录的是进程执行内核代码的时间.tms_cutime记录的是子进程执行用户代码的时间.tms_cstime记录的是子进程执行内核代码的时间.2)测试: vi test2.c#include &lt;sys/times.h&gt;#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;sys/types.h&gt;#include &lt;unistd.h&gt;static void do_cmd(char *);static void pr_times(clock_t, struct tms *, struct tms *); int main(int argc, char *argv[]){int i;for(i=1; argv[i]!=NULL; i++){do_cmd(argv[i]);}exit(1);}static void do_cmd(char *cmd){struct tms tmsstart, tmsend;clock_t start, end;int status;if((start=times(&amp;tmsstart))== -1)puts("times error");if((status=system(cmd))&lt;0)puts("system error");if((end=times(&amp;tmsend))== -1)puts("times error");pr_times(end-start, &amp;tmsstart,&amp;tmsend);exit(0);}static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend){static long clktck=0;if(0 == clktck)if((clktck=sysconf(_SC_CLK_TCK))&lt;0)puts("sysconf err");printf("real:%7.2f\n", real/(double)clktck);printf("user-cpu:%7.2f\n", (tmsend-&gt;tms_utime - tmsstart-&gt;tms_utime)/(double)clktck);printf("system-cpu:%7.2f\n",(tmsend-&gt;tms_stime -tmsstart-&gt;tms_stime)/(double)clktck);printf("child-user-cpu:%7.2f\n",(tmsend-&gt;tms_cutime -tmsstart-&gt;tms_cutime)/(double)clktck);printf("child-system-cpu:%7.2f\n",(tmsend-&gt;tms_cstime -tmsstart-&gt;tms_cstime)/(double)clktck);}编译:gcc test2.c -o test2测试这个程序:time ./test2 "dd if=/dev/zero f=/dev/null bs=1Mcount=10000"10000+0 records in10000+0 records out10485760000 bytes (10 GB) copied, 4.93028 s, 2.1 GB/s real: 4.94user-cpu: 0.00system-cpu: 0.00child-user-cpu: 0.01child-system-cpu: 4.82real 0m4.943suser 0m0.016ssys 0m4.828s核心代码:clock_t start,end;struct tms start_tms,end_tms;start = times(&amp;start_tms); ...............................end = times(&amp;end_tms);static long clktck;clktck = sysconf(_SC_CLK_TCK)三)实时函数clock_gettime在POSIX1003.1中增添了这个函数,它的原型如下:int clock_gettime(clockid_t clk_id, struct timespec *tp);它有以下的特点:1)它也有一个时间结构体:timespec ,timespec计算时间次数的单位是十亿分之一秒.strace timespec{time_t tv_sec;long tv_nsec;}2)clockid_t是确定哪个时钟类型.CLOCK_REALTIME: 标准POSIX实时时钟CLOCK_MONOTONIC: POSIX时钟,以恒定速率运行;不会复位和调整,它的取值和CLOCK_REALTIME是一样的. CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID是CPU中的硬件计时器中实现的.3)测试:#include&lt;time.h&gt;#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#define MILLION 1000000int main(void){long int loop = 1000;struct timespec tpstart;struct timespec tpend;long timedif;clock_gettime(CLOCK_MONOTONIC,&amp;tpstart);while (--loop){system("cd");}clock_gettime(CLOCK_MONOTONIC,&amp;tpend);timedif =MILLION*(__sec)+(_nsec-tpst_nsec)/1000;fprintf(stdout, "it took %ld microseconds\n", timedif);return 0;}编译:gcc test3.c -lrt -o test3计算时间:time ./test3it took 3463843 microsecondsreal 0m3.467suser 0m0.512ssys 0m2.936s核心代码:struct timespec start_tp;struct timespec end_tp;clock_gettime(CLOCK_REALTIME,&amp;start_tp); .......................................................................clock_gettime(CLOCK_REALTIME,&amp;end_tp);四)时间函数gettimeofday()1)概述:gettimeofday()可以获得当前系统的时间,是一个绝对值原型如下:int gettimeofday ( struct timeval * tv , struct timezone * tz ) timeval结型体的原型如下:struct timeval {time_t tv_sec;suseconds_t tv_usec;};所以它可以精确到微秒测试:#include &lt;sys/time.h&gt;#include &lt;stdio.h&gt;#include &lt;unistd.h&gt;intmain(){int i=10000000;struct timeval tvs,tve;gettimeofday(&amp;tvs,NULL);while (--i);gettimeofday(&amp;tve,NULL);double span = __sec +(__usec)/1000000.0;printf("time: %.12f\n",span);return 0;}gcc test5.c./a.outtime: 0.0412********核心代码:struct timeval start_tv,end_tv;gettimeofday(&amp;start_tv,NULL); ..............................................gettimeofday(&amp;end_tv,NULL);五)四种时间函数的比较1)精确度比较:以下是各种精确度的类型转换:1秒=1000毫秒(ms), 1毫秒=1/1000秒(s);1秒=1000000 微秒(μs), 1微秒=1/1000000秒(s);1秒=1000000000 纳秒(ns),1纳秒=1/1000000000秒(s);2)clock()函数的精确度是10毫秒(ms)times()函数的精确度是10毫秒(ms)gettimofday()函数的精确度是微秒(μs)clock_gettime()函数的计量单位为十亿分之一,也就是纳秒(ns)3)测试4种函数的精确度:vi test4.c#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;unistd.h&gt;#include &lt;time.h&gt;#include &lt;sys/times.h&gt;#include &lt;sys/time.h&gt;#define WAIT for(i=0;i&lt;298765432;i++);#define MILLION 1000000intmain ( int argc, char *argv[] ){int i;long ttt;clock_t s,e;struct tms aaa;s=clock();WAIT;e=clock();printf("clocktime : %.12f\n",(e-s)/(double)CLOCKS_PER_SEC);long tps = sysconf(_SC_CLK_TCK);s=times(&amp;aaa);WAIT;e=times(&amp;aaa);printf("times time : %.12f\n",(e-s)/(double)tps);struct timeval tvs,tve;gettimeofday(&amp;tvs,NULL);WAIT;gettimeofday(&amp;tve,NULL);double span = __sec +(__usec)/1000000.0;printf("gettimeofday time: %.12f\n",span);struct timespec tpstart;struct timespec tpend;clock_gettime(CLOCK_REALTIME, &amp;tpstart);WAIT;clock_gettime(CLOCK_REALTIME, &amp;tpend);double timedif =(__sec)+(__nse c)/1000000000.0;printf("clock_gettime time: %.12f\n", timedif);return EXIT_SUCCESS;}gcc -lrt test4.c -o test4debian:/tmp# ./test4clock time : 1.190000000000times time : 1.180000000000gettimeofday time: 1.186477000000clock_gettime time: 1.179271718000六)内核时钟默认的Linux时钟周期是100HZ,而现在最新的内核时钟周期默认为250HZ.如何得到内核的时钟周期呢?grep ^CONFIG_HZ /boot/config-2.6.26-1-xen-amd64 CONFIG_HZ_250=yCONFIG_HZ=250结果就是250HZ.而用sysconf(_SC_CLK_TCK);得到的却是100HZ例如:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;unistd.h&gt;#include &lt;time.h&gt;#include &lt;sys/times.h&gt;#include &lt;sys/time.h&gt;intmain ( int argc, char *argv[] ){long tps = sysconf(_SC_CLK_TCK);printf("%ld\n", tps);return EXIT_SUCCESS;}为什么得到的是不同的值呢?因为sysconf(_SC_CLK_TCK)和CONFIG_HZ所代表的意义是不同的.sysconf(_SC_CLK_TCK)是GNU标准库的clock_t频率.它的定义位置在:/usr/include/asm/param.h例如:#ifndef HZ#define HZ 100#endif最后总结一下内核时间:内核的标准时间是jiffy,一个jiffy就是一个内部时钟周期,而内部时钟周期是由250HZ的频率所产生中的,也就是一个时钟滴答,间隔时间是4毫秒(ms).也就是说:1个jiffy=1个内部时钟周期=250HZ=1个时钟滴答=4毫秒每经过一个时钟滴答就会调用一次时钟中断处理程序,处理程序用jiffy来累计时钟滴答数,每发生一次时钟中断就增1. 而每个中断之后,系统通过调度程序跟据时间片选择是否要进程继续运行,或让进程进入就绪状态.最后需要说明的是每个操作系统的时钟滴答频率都是不一样的,LINUX可以选择(100,250,1000)HZ,而DOS的频率是55HZ.七)为应用程序计时用time程序可以监视任何命令或脚本占用CPU的情况.1)bash内置命令time例如:time sleep 1real 0m1.016suser 0m0.000ssys 0m0.004s2)/usr/bin/time的一般命令行例如:\time sleep 10.00user 0.00system 0:01.01elapsed 0%CPU(0avgtext+0avgdata 0maxresident)k0inputs+0outputs (1major+176minor)pagefaults 0swaps 注:在命令前加上斜杠可以绕过内部命令./usr/bin/time还可以加上-v看到更具体的输出:\time -v sleep 1Command being timed: "sleep 1"User time (seconds): 0.00System time (seconds): 0.00Percent of CPU this job got: 0%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.00Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 0Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 178Voluntary context switches: 2Involuntary context switches: 0Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0这里的输出更多来源于结构体rusage.最后,我们看到real time大于user time和sys time的总和,这说明进程不是在系统调用中阻塞,就是得不到运行的机会. 而sleep()的运用,也说明了这一点。

linux下的时间转换函数

linux下的时间转换函数

linux下的时间函数我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。

linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。

time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微妙。

struct timeval{long tv_sec; /*秒*/long tv_usec; /*微秒*/};而直接存储年月日的是一个结构:struct tm{int tm_sec; /*秒,正常范围0-59,但允许至61*/int tm_min; /*分钟,0-59*/int tm_hour; /*小时,0-23*/int tm_mday; /*日,即一个月中的第几天,1-31*/int tm_mon; /*月,从一月算起,0-11*/int tm_year; /*年,从1900至今已经多少年*/int tm_wday; /*星期,一周中的第几天,从星期日算起,0-6*/int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/int tm_isdst; /*日光节约时间的旗标*/};需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2008年,月份从0开始的,0表示一月,星期也是从0开始的,0表示星期日,1表示星期一。

下面介绍一下我们常用的时间函数:#include <time.h>char *asctime(const struct tm* timeptr);将结构中的信息转换为真实世界的时间,以字符串的形式显示char *ctime(const time_t *timep);将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样double difftime(time_t time1, time_t time2);返回两个时间相差的秒数int gettimeofday(struct timeval *tv, struct timezone *tz);返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用struct tm* gmtime(const time_t *timep);将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针stuct tm* localtime(const time_t *timep);和gmtime类似,但是它是经过时区转换的时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
time_t the_time;
for(i = 1; i <= 10; i++) {
the_time = time((time_t *)0);
printf(“The time is %ld\n”, the_time);
“%a %b %d %H:%M:%S %Y”
为了有助于读取日期,我们可以使用 strptime 函数,这个函数会将一个表示日期与时间的字 符串作为参数,并且创建一个表示同样日期与时间 tm 结构:
#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *timeptr);
tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday); printf(“time: %02d:%02d:%02d\n”,
tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); exit(0); } 当我们运行这个程序时,我们会得到更可读的时间与日期值: $ ./gmtime; date Raw time is 1044696004 gmtime gives: date: 103/02/08 time: 09:20:04 Sat Feb 8 09:20:04 GMT 2003 工作原理 这个程序调用 time 函数得到一个底层的时间值,然后调用 gmtime 将其转换为一个具有时 间 与日期值的结构。程序会使用 printf 函数打印输出。严格来讲,我们不应使用这种方式打印原始 时间,因为并不能保证在所有的系统他都是一个 long 类 型。在 gmtime 函数之后,我们立即运行 date 命令来比较其输出。 然而,在这里我们一个小问题。如果我们在一个不使用格林尼治时间的时区运行这个程序,或 者是 我们本地的白天存储时间是有效的(问题?),我们就会注意到这个时间并不正确。这是因为 gmtime 是使用 GMT 返回时间。Linux 与 Unix 系统这样 做,从而世界上的程序与系统都是同步的。 不同时区在同一时间创建的文件会显示出具有相同的创建时间。要查看本地时间,我们需要使用 localtime 函数 来代替。 #include <time.h> struct tm *localtime(const time_t *timeval);
tm 结构的定义至少包含下列成员:
成员
描述
int tm_sec 秒,0-61
int tm_min 分,0-59
int tm_hour 时,0-23
int tm_mday 一月中的天,1-31
int tm_mon 一年中的月,0-11(一月为 0)
int tm_year 由 1900 年起的年数
int tm_wday 一星期中的天,0-6(星期日为 0)
time_t timeval; (void)time(&timeval); printf(“The date is: %s”, ctime(&timeval));
-5-
exit(0);
}
将其保存为 ctim.c,编译运行,我们应可以看到下面的输出:
$ ./ctime
The date is: Sat Feb strftime 的格式化字符串完全相同。strptime 的动作形为与 sscanf 相似,因为他们都搜索字符串,查找标识的域,然后将他 们写入变量。在这里的变量为依据格式 化字符串要填充的 tm 结构的成员。然而,与 strftime 的转义字符比起来,strptime 的转义字符 是不严密 的,因为 strptime 会在天与月上允许简写与全名两种形式。每一个表示都会匹配 strptime 中的一个%a 说明符。strftime 总是在小于 10 的数字上添加 0,而 strptime 会将其看作 可选的。
时间是使用一个定义的 time_t 类型来处理。这是一个足够大的整数类型来包含以秒计的日期 与时间值。在 Linux 系统上,他是一个长整数,其定义以及相关的操作函数都定义在头文件 time.h 中。
不要认为时间是 32 位的。在 Unix 以及 Linux 系统上使用一个 32 位的 time_t 类型,而这个时 间会在 2038 年重叠。到那时,我们希望这些系统都使用一个大于 32 位的 time_t 类型。
-1-
sleep(2); } exit(0); } 当我们运行这个程序时,他会每隔 2 秒打印出底层时间值。 $ ./envtime The time is 1044695820 The time is 1044695822 The time is 1044695824 The time is 1044695826 The time is 1044695828 The time is 1044695830 The time is 1044695832 The time is 1044695834 The time is 1044695836 The time is 1044695838 工作原理 这个程序使用一个空指针参数来调用 time 函数,这个函数会返回以秒计的时间与日期值。程 序会休眠 2 秒,并且重复调用 time 函数 10 次。 使用由 1970 年开始的以秒计的时间与日期值对于估量某件事持续多少时间是十分有用的。我 们 只需要简单的使用两个由 time 调用得到的时间进行减法操作即可。然而结过仔细的考虑, ISO/ANSIC C 标准委员会并没有说时 time_t 类型要用于计量以秒计的时间间隔值,所以他们开发 了一个函数,difftime,这个函数会计算两个 time_t 值之 间的间隔,并且返回一个 double 类型: #include <time.h> double difftime(time_t time1, time_t time2); difftime 函数计算两个时间值之间的间隔,并且返回 time1-time2 的浮点值。对于 Linux 系 统而言,由 time 返回的值是秒数,并且可以进行操作,但是为了移植考虑,我们应使用 difftime 函数。
-4-
localtime 函数与 gmtime 相同,所不同的是他会返回一个包含为本地时区进行过调整后的结 构。如果我们再次试验 gmtime 程序,但是使用 localtime 函数来替换 gmtime,我们就会看到一个 正确的时间与日期报告。
要将一个打乱的 tm 结构转换为一个原始的 time_t 值,我们可以使用 mktime 函数: #include <time.h> time_t mktime(struct tm *timeptr); 如果结构不可以表示为一个 time_t 值,mktime 函数会返回-1。 与 date 程序所提供的时间与日期等机器值相反,为了友好,我们可以使用 asctime 与 ctime 函数: #include <time.h> char *asctime(const struct tm *timeptr); char *ctime(const time_t *timeval); asctime 函数返回一个代表 tm 结构 timeptr 给出的时间与日期的字符串。返回的字符串的格 式如下: Sun Jun 6 12:30:34 1999\n\0 他总是 26 个字符长的固定格式。函数 ctime 与下面的函数调用等同: asctime(localtime(timeval)) 他使用一个原始时间值作为参数,并将其转换为一个更可读的本地时间。 试验--ctime 让我们使用下面的代码来实际的看一下 ctime: #include <time.h> #include <stdio.h> int main() {
转义符
描述
%a
简写的星期名
%A
全写的星期名
%b
简写的月名
%B
全写的月名
%c
日期与时间
%d
一月中的天,01-31
%H
时,00-23
%I
12 小时时钟表示的小时,01-12
%j
一年中的天,001-366
%m
一年中的月,01-12
%M
分,00-59
-6-
%P
a.m 或 p.m
%S
秒,00-61
%u
星期中的天,1-7(星期 1 为 1)
#include <time.h>
time_t time(time_t *tloc);
我们可以调用 time 函数来得到一个底层的时间值,这个函数会返回由纪元起点开始的秒数。 如果 tloc 不为空指针,函数就会将返回值写入 tloc 所指的变量中。
试验--时间
这里是一个简单的时间程序,envtime.c,来演示 time 函数:
#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);
strftime 函数会格式化由 timeptr 指向的 tm 结构表示的时间与日期,并将其结构放在字符串 s 中。字符串被指明至少 maxsize 字符长。format 字符串用 来控制写入字符串的字符。与 printf 相似,他包含要传递到字符串的通常字符与格式化时间与日期元素的转义说明。转义说明包括:
-2-
为了以更为有意义的方式来表示时间与日期,我们需要将时间值转换为可以识别的时间与日 期。这有标准的函数可以帮助我们做到。
相关文档
最新文档