本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操做所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还经过大量的实例向你展现了time.h头文件中声明的各类函数和数据结构的详细使用方法。 编程
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:日历时间,是用“从一个标准时间点到此时的时间通过的秒数”来表示的时间。这个标准时间点对不一样的编译器来讲会有所不一样,但对一个编译系统来讲,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都经过该标准时间点来衡量,因此能够说日历时间是“相对时间”,可是不管你在哪个时区,在同一时刻对同一个标准时间点来讲,日历时间都是同样的。 oop
epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。 学习
clock tick:时钟计时单元(而不把它叫作时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。 3d
咱们可使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,不管是在结构定义,仍是命名,都具备明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。 对象
2. 计时
C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义以下: blog
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函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:
在笔者的编译器上,运行结果以下:
Time to do 10000000 empty loops is 0.03000 seconds
上面咱们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么咱们可不能够经过改变CLOCKS_PER_SEC的定义,经过把它定义的大一些,从而使计时精度更高呢?经过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。
3.与日期和时间相关的数据结构
在标准C/C++中,咱们可经过tm结构来得到日期和时间,tm结构在time.h中的定义以下:
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。
而日历时间(Calendar Time)是经过time_t数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,咱们也能够看到time_t是一个长整型数:
你们可能会产生疑问:既然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秒到该时间点所通过的秒数。
关于时间和日期的函数应用,咱们将在下节详细阐述,但愿对你们有帮助!
自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一块儿学习成长!
C语言C++编程学习交流圈子,【点击进入】微信公众号:C语言编程学习基地
有一些源码和资料分享,欢迎转行也学习编程的伙伴,和你们一块儿交流成长会比本身琢磨更快哦!