C <time.h> 时间头文件
一、几个时间概念
1.1 UTC:世界标准时间
协调世界时,又称为世界标准时间,为大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。
1.2 Calendar Time:日历时间
“从一个标准时间点到此时的时间经过的秒数”来表示的时间。
这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
1.3 Epoch:时间点
时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。
1.4 Clock tick:时钟计时单元
一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。
二、具体操作示例及解释
2.1 计时
计时函数:clock();
数据类型:clock_t,为long数据类型;
定义:clock_t clock(void);
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
描述:从“开启这个程序进程”到“程序中调用clock()函数”时,处理器时钟所使用的时间。为了获取 CPU 所使用的秒数,您需要除以 CLOCKS_PER_SEC。
返回:该函数返回自程序启动起,处理器时钟所使用的时间。如果失败,则返回 -1 值。
1 #include <time.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 clock_t start_t, end_t, total_t; 7 int i; 8 9 start_t = clock(); 10 printf("程序启动,start_t = %ld\n", start_t); 11 12 printf("开始一个大循环,start_t = %ld\n", start_t); 13 for(i=0; i< 10000000; i++) 14 { 15 } 16 end_t = clock(); 17 printf("大循环结束,end_t = %ld\n", end_t); 18 19 total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC; 20 printf("CPU 占用的总时间:%f\n", total_t ); 21 printf("程序退出...\n"); 22 23 return(0); 24 }
2.2 时间和日期相关函数
2.2.1 在标准C/C++中,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
2.2.2 日历时间(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
2.2.3 time.h头文件中的其他的一些函数
double difftime(time_t time1, time_t time0); //返回以双精度浮点型 double 值表示的两个时间之间相差的秒数 (time2 - time1)。
time_t mktime(struct tm * timeptr); //把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值,如果发生错误,则返回 -1 值。
time_t time(time_t * timer); //返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。
char * asctime(const struct tm * timeptr); //返回一个指向字符串的指针,它代表了结构 struct timeptr 的日期和时间。包含了可读格式的日期和时间信息 Www Mmm dd hh:mm:ss yyyy,其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yyyy 表示年份。
char * ctime(const time_t *timer);//返回一个表示当地时间的字符串,当地时间是基于参数 timer。返回的字符串格式如下: Www Mmm dd hh:mm:ss yyyy 其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yyyy 表示年份。
struct tm * gmtime(const time_t *timer); //使用 timer 的值来填充 tm 结构,并用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
struct tm * localtime(const time_t * timer); //使用 timer 的值来填充 tm 结构。timer 的值被分解为 tm 结构,并用本地时区表示。
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) ;//根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中,最多向str中存放maxsize个字符。forexample: strftime(str,100,"It is now %I %p\n",ptr);