c语言时间函数

上传人:工**** 文档编号:464486351 上传时间:2023-05-15 格式:DOC 页数:10 大小:171KB
返回 下载 相关 举报
c语言时间函数_第1页
第1页 / 共10页
c语言时间函数_第2页
第2页 / 共10页
c语言时间函数_第3页
第3页 / 共10页
c语言时间函数_第4页
第4页 / 共10页
c语言时间函数_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《c语言时间函数》由会员分享,可在线阅读,更多相关《c语言时间函数(10页珍藏版)》请在金锄头文库上搜索。

1、本文从介绍基础概念入手,探讨了在C/C+中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例 向你展示了 time.h 头文件中声明的各种函数和数据结构的详细使用方法。关键字:UTC(世界标准时间),Calendar Time (日历时间),epoch (时间点),clock tick (时钟计时单元)1概念 在C/C+中,对字符串的操作有很多值得注意的问题,同样,C/C+对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C+语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要

2、介绍在C/C+中时间和日期的使用方法.通过学习许多 C/C+库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些 “时间”和“日期”的概念,主要有以下几个:Coordinated Universal Time( UTC :协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间( Greenwich Mean Time, GMT。比如,中国内地的时间与UTC的时差为+8,也就是 UTC+8美国是 UTC-5。Calendar Time: 日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时 间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,

3、这个标准时 间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以 说日历时间是 “相对时间” ,但是无论你在哪一个时区, 在同一时刻对同一个标准时间点来说, 日历时间都是一样的。epoch :时间点。时间点在标准 C/C+中是一个整数,它用此时的时间和标准时间点相差的秒 数(即日历时间)来表示。clock tick :时钟计时单元(而不把它叫做时钟滴答次数) ,一个时钟计时单元的时间长短是 由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C+的一个基本计时单位。我们可以使用 ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期

4、所使用的方 法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C+中怎样使用日期的时间功能。2 计时C/C+中的计时函数是 clock(),而与其相关的数据类型是 clock_t。在MSDN中,查得对clock 函数定义如下:clock_t clock( void );这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的 CPU时钟计时单元(clock tick )数,在MSDN中称之为挂钟时间(wal-clock )。其中clock_t是用来保 存时间的数据类型,在 time.h 文件中,我们可以找到对它的定义:#ifndef _CLOCK_

5、T_DEFINEDtypedef long clock_t;#define _CLOCK_T_DEFINED#endif很明显, clock_t 是一个长整形数。在 time.h 文件中,还定义了一个常量CLOCKS_PER_S,EC它用来表示一秒钟会有多少个时钟计时单元,其定义如下:#define CLOCKS_PER_SEC (clock_t)1000)可以看到每过千分之一秒( 1 毫秒),调用 clock ()函数返回的值就加 1 。下面举个例子,你可以使用公式 clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:void elapsed_time()printf(

6、Elapsed time:%u secs.n,clock()/CLOCKS_PER_SEC);当然,你也可以用 clock 函数来计算你的机器运行一个循环或者处理其它事件到底花了多少 时间:#include “ stdio.h ”#include “ stdlib.h ”#include “ time.h ”int main( void )long i = 10000000L;clock_t start, finish;double duration;/* 测量一个事件持续的时间 */ printf( Time to do %ld empty loops is , i );start = cl

7、ock();while( i- ) ;finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( %f secondsn, duration );2 time.h 从头学。喜欢玩“时间”的朋友不要错过。 system(pause);在笔者的机器上,运行结果如下:面我们看到时钟计时单元的长度为Time to do 10000000 empty loops is 0.03000 seconds1 毫秒,那么计时的精度也为 1 毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC定义,通过把它定义

8、的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C+中,最小的计时单位是一毫秒。3与日期和时间相关的数据结构在标准C/C+中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:#ifndef _TM_DEFINED struct tm int tm_sec; /* int tm_min; /* int tm_hour; /* int tm_mday; /* int tm_mon; /* int tm_year; /*tm_wday; /*取值区间为 0,59 */取值区间为 0,59 */取值区间为 0,23 */取值区间为 1,31 */ 0代

9、表一月) - 取值区间为 0,11 */1900 */秒-分 -时 -一个月中的日期int*/int日,月份(从一月开始,年份,其值等于实际年份减去星期-取值区间为0,6,其中0代表星期天,1代表星期一,以此类推从每年的 1 月 1 日开始的天数tm_yday; /*1 代表 1 月 2 日,以此类推 */取值区间为 0,365 ,其中 0 代表 1 月 1tm_isdst 为正。不实行夏令时的进*/(broken-down time) 。int tm_isdst; /* 夏令时标识符,实行夏令时的时候, 候, tm_isdst 为 0;不了解情况时,tm_isdst() 为负。;#defin

10、e _TM_DEFINED #endifANSI C 标准称使用 tm 结构的这种时间表示为分解时间而日历时间(Calendar Time)是通过time_t数据类型来表示的,用 time_t表示的时间(日 历时间)是从一个时间点(例如:1970年 1 月1 日 0时 0分0秒)到此时的秒数。在 time.h中,我们也可以看到 time_t 是一个长整型数:#ifndef _TIME_T_DEFINEDtypedef long time_t; /* 时间值 */#define _TIME_T_DEFINED /* 避免重复定义 time_t */#endif大家可能会产生疑问: 既然 time

11、_t 实际上是长整型, 到未来的某一天, 从一个时间点 (一般 是 1970 年 1 月 1 日 0 时 0 分 0 秒)到那时的秒数 (即日历时间) 超出了长整形所能表示的数 的范围怎么办?对 time_t 数据类型的值来说,它所表示的时间不能晚于 2038 年 1 月 18 日 19 时 14 分 07 秒。为了能够表示更久远的时间,一些编译器厂商引入了 64 位甚至更长的整 形数来保存日历时间。比如微软在Visual C+冲采用了 _time64_t数据类型来保存日历时间, 并通过 _time64() 函数来获得日历时间(而不是通过使用 32 位字的 time() 函数),这样就可 以通

12、过该数据类型保存 3001年 1月 1日 0时 0分 0秒(不包括该时间点)之前的时间。在 time.h 头文件中,我们还可以看到一些函数,它们都是以 time_t 为参数类型或返回值类 型的函数:double difftime(time_t time1, time_t time0);time_t mktime(struct tm * timeptr);time_t time(time_t * timer);char * asctime(const struct tm * timeptr);char * ctime(const time_t *timer);此外, time.h 还提供了两种不

13、同的函数将日历时间(一个用 time_t 表示的整数)转换为我 们平时看到的把年月日时分秒分开显示的时间格式tm:struct tm * gmtime(const time_t *timer);struct tm * localtime(const time_t * timer);通过查阅 MSD,N 我们可以知道 Microsoft C/C+ 7.0 中时间点的值( time_t 对象的值)是从 1899年12月31日 0时0分0秒到该时间点所经过的秒数,而其它各种版本的 Microsoft C/C+和所有不同版本的 Visual C+ 都是计算的从 1970年 1月 1日 0时 0分 0秒

14、到该时间点所经 过的秒数。4与日期和时间相关的函数及应用在本节, 我将向大家展示怎样利用 time.h 中声明的函数对时间进行操作。 这些操作包括取当 前时间、计算时间间隔、以不同的形式显示时间等内容。4.1 获得日历时间我们可以通过 time() 函数来获得日历时间( Calendar Time ),其原型为:作者:独它来t往2006-7-16 12:48回复此发言3 time.h 从头学。喜欢玩“时间”的朋友不要错过。time_t time(time_t * timer);如果你已经声明了参数 timer ,你可以从参数 timer 返回现在的日历时间,同时也可以通过 返回值返回现在的日历

15、时间,即从一个时间点(例如: 1970 年 1 月 1 日 0 时 0 分 0 秒)到现 在此时的秒数。如果参数为空(NUL,函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间:#include time.h#include stdio.hint main(void)struct tm *ptr;time_t lt;lt =time(NUL);printf(The Calendar Time now is %dn,lt);return 0;运行的结果与当时的时间有关,我当时运行的结果是:The Calendar Time now is 1122707619其中 1122707619就是我运行程序时的日历时间。即从 1970年1月 1日 0时 0分0秒到此时 的秒数。4.2 获得日期和时间这里说的日期和时间就是我们平时所说的年、月、日、时、分、秒等信息。从第2节我们已经知道这些信息都保存在一个名为 tm 的结构体中,那么

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号