c语言时间设置函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
很明显,clock_t 是一个长整形数。在 time.h 文件中,还定义了一个常量 CLOCKS_PER_SEC, 它用来表示一秒钟会有多少个时钟计时单元,其定义如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
可以看到可以看到每过千分之一秒(1 毫秒),调用 clock()函数返回的值就加 1。下面举 个例子,你可以使用公式 clock()/CLOCKS_PER_SEC 来计算一个进程自身的运行时间:
while( i-- )
;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}
在笔者的机器上,运行结果如下:
3、获得日期和时间
3、1gmtime 函数或 localtime 函数将 time_t 类型的时间日期转换为 struct tm 类型:
使用 time 函数返回的是一个 long 值,该值对用户的意义不大,一般不能根据其值
确定具体的年、月、日等数据。gmtime 函数可以方便的对 time_t 类型数据进行转
Time to do 10000000 empty loops is 0.03000 seconds
上面我们看到时钟计时单元的长度为 1 毫秒,那么计时的精度也为 1 毫秒,那么我们可不可 以通过改变 CLOCKS_PER_SEC 的定义,通过把它定义的大一些,从而使计时精度更高呢?通 过尝试,你会发现这样是不行的。在标准 C/C++中,最小的计时单位是一毫秒。
虽然该函数返回的以秒计算的时间间隔是 double 类型的,但这并不说明该时间具有同 double 一样的精确度,这是由它的参数觉得的(time_t 是以秒为单位计算的)。比如下面一段程序:
#include “time.h”
#include “stdio.h” #include “stdlib.h” int main(void) { time_t start,end; start = time(NULL); system("pause"); end = time(NULL); printf("The pause used %f seconds.\n",difftime(end,start));//<syபைடு நூலகம்tem("pause"); return 0; }
其运行结果是一样的。 5、自定义时间格式 我们可以使用 strftime()函数将时间格式化为我们想要的格式。它的原型如下:
size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr
一、tm 结构在 time.h 中的定义如下: #ifndef _TM_DEFINED struct 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 代表一月) - 取值区间为[0,11] */ int tm_year; /* 年份,其值等于实际年份减去 1900 */ int tm_wday; /* 星期 – 取值区间为[0,6],其中 0 代表星期天,1 代表星期一, 以此类推 */ int tm_yday; /* 从每年的 1 月 1 日开始的天数 – 取值区间为[0,365],其中 0 代表 1 月 1 日,1 代表 1 月 2 日,以此类推 */ int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst 为正。不实行夏令 时的进候,tm_isdst 为 0;不了解情况时,tm_isdst()为负。*/ }; #define _TM_DEFINED #endif
int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
注意:p=gmtime(&t);此行若改为 p=localtime(&t);则返回当前时区的时间 3、2 使用 mktime 函数将 struct tm 类型的时间日期转换为 time_t 类型:
表头文件 #include 定义函数 time_t mktime(strcut tm * timeptr); 函数说明
mktime()用来将参数 timeptr 所指的 tm 结构数据转换成从公元 1970 年 1 月 1 日 0 时 0 分 0 秒算起至今的 UTC 时间所经过的秒数。 返回值 返回经过的秒数。 换为秒数示例: #include #include int main() {
time_t t; struct tm stm; printf("请输入日期时间值(按 yyyy/mm/dd hh:mm:ss 格式):"); scanf("%d/%d/%d %d:%d:%d",&stm.tm_year,&stm.tm_mon,&stm.tm_mday,
DDD MMM dd hh:mm:ss YYYY 各字符的意义: DDD 一星期的某一天,如 Mon
MMM 月份,如 Jan dd 月中一天(1,2,……,31) hh 小时(1,2,……,24) mm 分钟(1,2,……,59) ss 秒数(1,2,……,59) YYYY 年 范例: 转换日期和时间为 ASCII 码
换,将其转换为 tm 结构的数据方便数据阅读。
gmtime 函数的原型如下: struct tm *gmtime(time_t *timep); localtime 函数的原型如下: struct tm *localtime(time_t *timep); 将参数 timep 所指的 time_t 类型信息转换成实际所使用的时间日期表示方法,将结 果返回到结构 tm 结构类型的变量。 gmtime 函数用来存放实际日期时间的结构变量是静态分配的,每次调用 gmtime 函 数都将重写该结构变量。如果希望保存结构变量中的内容,必须将其复制到 tm 结 构的另一个变量中。 gmtime 函数与 localtime 函数的区别: gmtime 函数返回的时间日期未经时区转换,是 UTC 时间(又称为世界时间,即格林 尼治时间)。 localtime 函数返回当前时区的时间, 转换日期时间表示形式 time_t 类型转换为 struct tm 类型示例: #include #include int main() {
);
我们可以根据 format 指向字符串中格式命令把 timeptr 中保存的时间信息放在 strDest 指向 的字符串中,最多向 strDest 中存放 maxsize 个字符。该函数返回向 strDest 指向的字符串中 放置的字符数。
void elapsed_time() { printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC); }
当然,你也可以用 clock 函数来计算你的机器运行一个循环或者处理其它事件到底花了多少 时间:
#include “stdio.h” #include “stdlib.h” #include “time.h”
运行结果为: 请按任意键继续. . . The pause used 2.000000 seconds. 请按任意键继续. . .
可以想像,暂停的时间并不那么巧是整整 2 秒钟。其实,你将上面程序的带有“//<-”注释 的一行用下面的一行代码替换:
printf("The pause used %f seconds.\n",end-start);
&stm.tm_hour,&stm.tm_min,&stm.tm_sec); stm.tm_year-=1900; /*年份值减去 1900,得到 tm 结构中保存的年份序数*/ stm.tm_mon-=1; /*月份值减去 1,得到 tm 结构中保存的月份序数*/ t=mktime(&stm); /* 若用户输入的日期时间有误,则函数返回值为-1*/ if(-1==t) {
3、3 原型: char *asctime(const struct tm *tblock); 功能说明: 将 tm 结构类型时间日期转换为 ASCII 码。 头文件:time.h 参数说明:语法:asctime[必要参数] 必要参数的具体说明如下:
tblock:待转换的时间指针,tblock 为一 tm 结构型指针。 返回值:返回由 tm 结构中的日期和时间转换成的字符串的地址,该字符串的形式定义如下:
#include #include int main() {
time_t t; struct tm *p; t=time(NULL); p=localtime(&t);
printf("%s\n", asctime(p)); return 0; }
char * ctime(const time_t *timer); 功能说明:通过日历时间来生成时间字符串。 头文件:time.h
二、time 函数 1、计时:clock() Clock_t clock(void); 在 time.h 中,我们可以找到队 clock 的定义:
#ifndef _CLOCK_T_DEFINED typedef long clock_t; #define _CLOCK_T_DEFINED #endif
char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};/*指针字符数组*/ time_t t; struct tm *p; t=time(NULL);/*获取从 1970 年 1 月 1 日零时到现在的秒数,保存到变量 t 中*/ p=gmtime(&t); /*变量 t 的值转换为实际日期时间的表示格式*/ printf("%d 年%02d 月%02d 日",(1900+p->tm_year), (1+p->tm_mon),p->tm_mday); printf(" %s ", wday[p->tm_wday]); printf("%02d:%02d:%02d\n", p->tm_hour, p->tm_min, p->tm_sec); return 0; }
4、计算持续的时间长度 有时候在实际应用中要计算一个事件持续的时间长度,比如计算打字速度。在第 1 节计时部 分中,我已经用 clock 函数举了一个例子。Clock()函数可以精确到毫秒级。同时,我们也可 以使用 difftime()函数,但它只能精确到秒。该函数的定义如下:
double difftime(time_t time1, time_t time0);
2、获得日历时间 time_t time(time_t * timer);
在 time.h 中,我们也可以看到 time_t 是一个长整型数:
#ifndef _TIME_T_DEFINED typedef long time_t; #define _TIME_T_DEFINED #endif
/* 时间值 */ /* 避免重复定义 time_t */
printf("输入的日期时间格式出错!\n"); exit(1); } printf("1970/01/01 00:00:00~%d/%02d/%02d %02d:%02d:%02d 共%d 秒\n", stm.tm_year+1900,stm.tm_mon,stm.tm_mday, stm.tm_hour,stm.tm_min,stm.tm_sec,t); return 0; }
相关文档
最新文档