linux下的时间编程

来源:互联网 发布:mysql存储emoji乱码 编辑:程序博客网 时间:2024/06/05 16:21

在做linux下的应用程序时,我们经常需要获取当前的系统时间或者进行时间的计算,这时候需要用到linux下的时间函数。

1. 几个时间的概念区分

   (1) 格林威治时间

         格林威治时间也即格林尼治标准时间(旧译格林尼治平均时间或格林威治标准时间;英语:Greenwich MeanTime,GMT),是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间。这个时间是世界统一的,然后不同国家根据自己的经度进行换算来得到本地时间,比如:格林威治时间+8小时=北京时间。

  (2) 日历时间

        日历时间(calender time),是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。

    这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以

说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的,也即"日历时间"跟时区无关,只跟系统类型有关。

         在linux中,一般用1970年1月1日0点作为“标准时间”。

  (3) 本地时间

         本地时间是跟时区紧密相关的,在所有的机器上,格林威治时间是相同的,然后根据机器所在的时区来确定本地时间。        

2. 时间函数里用到的数据类型

   要使用到时间编程函数,需要在包含头文件time.h

   然后我们需要先了解下几个有关时间的数据类型。

    time_t:定义时间变量  struct timeval  {        int tv_sec;   //用来存放秒数      int tv_usec;  //用来存放微秒  }   struct tm  {     int tm_sec;   //秒     int tm_min;   //分     int tm_hour;  //时     int tm_mday;  //本月第几日     int tm_mon;   //本年第几月     int tm_year;  //相对值,需要+1900才得到真实值     int tm_wday;  //本周第几日     int tm_yday;  //本年第几日     int tm_isdst; //日光节约时间  }; 
3.时间函数说明

   (1)time_t time(time_t *tloc)

             获取日历时间,在linux中,即是从1970年1月1日0点到现在所经历的秒数。

   (2)struct tm *gmtime(const time_t  *timep)

              将日历时间转化为格林威治,并保存至tm结构。

   (3)struct tm * localtime(const time_t *timep)

              将日历时间转化为本地时间,并保存至tm结构。该函数将会检测你设置的你所在的时区,然后计算本地时间。

   (4)char *asctime(const struct tm *tm)

             将tm格式的时间转化为字符串。

             我们如果直接使用tm结构体,是不方便的,所以有必要将她转化成字符串的形式,比如我们要打印时间时,先将时间转化成字符串将方便我们的打印。  

            注意,这个tm保存的可以是日历时间,也可以保存格林威治时间。

   (5)char *ctime(const time_t *timep)

             将日历时间转化为本地时间的字符串。

   (6)int gettimeofday(struct timeval *tv, struct timezone *tz)

            获取从今日凌晨到现在的时间差,常用于时间耗时计算。

4. 时间编程实例

#include <sys/time.h>#include <stdio.h>int main(char argc,char argv[]){    struct tm *tm_p;    struct timeval tv1;    struct timeval tv2;    time_t loc_t;        int i,j;         loc_t=time(NULL);//获取日历时间    printf("Cal_time is:%d \n",loc_t);//打印日历时间        tm_p=gmtime(&loc_t);//将日历时间转化成格林威治时间    printf("GMT is:%s \n",asctime(tm_p));//打印格林威治时间         printf("Local time is:%s \n",ctime(&loc_t));//将日历时间转化成本地时间的字符串形式,并打印        gettimeofday(&tv1,NULL);    for(i=0;i<60000;i++);//循环来流逝时间    gettimeofday(&tv2,NULL);     printf("cost time is:%d \n",(tv2.tv_usec)-(tv1.tv_usec) );//计算流逝的微秒数       return 0;}/********************************************END****************************************************/

运行后的结果如下:


5. 总结

    有关linux里的时间函数,需要调用到内核提供的系统调用,有关内核里的具体实现有时间再仔细研究。


    注:本文章纯属个人的学习总结笔记,不保证文章的正确性。