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++中怎样使用日期的时间功能。
1、计时 C/C++中的计时函数是clock()
而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:
clock_t clock( void );
这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时 之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wall-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来计算一个进程自身的运行时间:
1 void elapsed_time()
2 {
3 printf("Elapsed time:%u secs./n",clock()/CLOCKS_PER_SEC);
4 }
当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:
1 #i nclude “stdio.h”
2 #i nclude “stdlib.h”
3 #i nclude “time.h”
4 int main( void )
5 {
6 long i = 10000000L;
7 clock_t start, finish;
8 double duration;
9 printf( "Time to do %ld empty loops is ", i );
10 start = clock(); while( i-- ) ;
11 finish = clock();
12 duration = (double)(finish - start) / CLOCKS_PER_SEC;
13 printf( "%f seconds/n", duration );
14 system("pause");
15 }
在笔者的机器上,运行结果如下:
1 Time to do 10000000 empty loops is 0.03000 seconds
上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。
2、与日期和时间相关的数据结构
在标准C/C++中,我们可通过tm结构来获得日期和时间。
tm结构在time.h中的定义如下:
1 #ifndef _TM_DEFINED
2 struct tm
3 { int tm_sec; /* 秒 – 取值区间为[0,59] */
4 int tm_min; /* 分 - 取值区间为[0,59] */
5 int tm_hour; /* 时 - 取值区间为[0,23] */
6 int tm_mday;/* 一个月中的日期 - 取值区间为[1,31] */
7 int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
8 int tm_year; /* 年份,其值等于实际年份减去1900 */
9 int tm_wday;/* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
10 int tm_yday;/* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
11 int tm_isdst;/* 夏令时标识符,实行夏令时,tm_isdst为正。不实行夏令时,tm_isdst为