C/C++时间函数大总结

      这里从基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。然后通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法,最后再对sys/timeb.h(其为time.h的补充)作以总结。
关键字:

UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元) 

1.概念
          通过学习许多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++中怎样使用日期的时间功能。
头文件 time.h 中的函数:
函数名 函数用途
clock 得到处理器时间
difftime 得到时间差
mktime 设置时间
time 得到时间
asctime 得到以ASCII码表示的时间
ctime 得到字符串表示的时间
strftime 得到指定格式的时间


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函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

说明:计算程序运行时间可用time()或clock(),不过clock可精确到毫秒,而time只能精确到秒
#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 seconds\n", 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 */ 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值