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); 

posted on 2017-07-26 15:33  萧飞IDO  阅读(869)  评论(0编辑  收藏  举报

导航