资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
本文从介绍基础概念入手,探讨了在 C/C+中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了 time.h 头文件中声明的各种函数和数据结构的详细使用方法。 关键字:UTC(世界标准时间) ,Calendar Time(日历时间) ,epoch(时间点) ,clock tick(时钟计时单元) 1概念 在 C/C+中,对字符串的操作有很多值得注意的问题,同样,C/C+对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过 C+语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在 C/C+中时间和日期的使用方法. 通过学习许多 C/C+库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个: Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT) 。比如,中国内地的时间与 UTC 的时差为+8,也就是 UTC+8。美国是 UTC-5。 Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间” ,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。 epoch:时间点。时间点在标准 C/C+中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。 clock tick:时钟计时单元(而不把它叫做时钟滴答次数) ,一个时钟计时单元的时间长短是由 CPU 控制的。一个 clock tick 不是 CPU 的一个时钟周期,而是 C/C+的一个基本计时单位。 我们可以使用 ANSI 标准库中的 time.h 头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的 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_T_DEFINED typedef long clock_t; #define _CLOCK_T_DEFINED #endif 很明显,clock_t 是一个长整形数。在 time.h 文件中,还定义了一个常量 CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下: #define CLOCKS_PER_SEC (clock_t)1000) 可以看到每过千分之一秒(1 毫秒) ,调用 clock()函数返回的值就加 1。下面举个例子,你可以使用公式 clock()/CLOCKS_PER_SEC 来计算一个进程自身的运行时间: void elapsed_time() printf(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 = clock(); while( i- ) ; finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( %f secondsn, duration ); system(pause); 在笔者的机器上,运行结果如下: Time to do 10000000 empty loops is 0.03000 seconds 上面我们看到时钟计时单元的长度为 1 毫秒,那么计时的精度也为 1 毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC 的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准 C/C+中,最小的计时单位是一毫秒。 3与日期和时间相关的数据结构 在标准 C/C+中,我们可通过 tm 结构来获得日期和时间,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 ANSI C 标准称使用 tm 结构的这种时间表示为分解时间(broken-down time)。 而日历时间(Calendar Time)是通过 time_t 数据类型来表示的,用 time_t 表示的时间(日历时间)是从一个时间点(例如:1970 年 1 月 1 日 0 时 0 分 0 秒)到此时的秒数。在 time.h 中,我们也可以看到time_t 是一个长整型数: #ifndef _TIME_T_DEFINED typedef long time_t; /* 时间值 */ #define _TIME_T_DEFINED /* 避免重复定义 time_t */ #endif 大家可能会产生疑问:既然 time_t 实际上是长整型,到未来的某一天,从一个时间点(一般是 1970 年 1月 1 日 0 时 0 分 0 秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?对time_t 数据类型的值来说,它所表示的时间不能晚于 2038 年 1 月 18 日 19 时 14 分 07 秒。为了能够表示更久远的时间,一些编译器厂商引入了 64 位甚至更长的整形数来保存日历时间。比如微软在 Visual C+中采用了_time64_t 数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32 位字的 time()函数) ,这样就可以通过该数据类型保存 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 还提供了两种不同的函数将日历时间(一个用 time_t 表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式 tm: struct tm * gmtime(const time_t *timer); struct tm * localtime(const time_t * timer); 通过查阅 MSDN,我们可以知道 Microsoft C/C+ 7.0 中时间点的值(time_t 对象的值)是从 1899 年 12月 31 日 0 时 0 分 0 秒到该时间点所经过的秒数,而其它各种版本的 Microsoft C/C+和所有不同版本的Visual C+都是计算的从 1970 年 1 月 1 日 0 时 0 分 0 秒到该时间点所经过的秒数。 4与日期和时间相关的函数及应用 在本节,我将向大家展示怎样利用 time.h 中声明的函数对时间进行操作。这些操作包括取当前时间、计算时间间隔、以不同的形式显示时间等内容。 4.1 获得日历时间 我们可以通过 time()函数来获得日历时间(Calendar Time) ,其原型为:time_t time(time_t * timer); 如果你已经声明了参数 timer,你可以从参数 timer 返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970 年 1 月 1 日 0 时 0 分 0 秒)到现在此时的秒数。如果参数为空(NUL) ,函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间: #include time.h #include stdio.h int 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 的结构体中,那么如何将一个日历时间保存为一个 tm 结构的对象呢? 其中可以使用的函数是 gmtime()和 localtim
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号