Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80232
  • 博文数量: 58
  • 博客积分: 130
  • 博客等级: 入伍新兵
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 21:38
文章分类
文章存档

2012年(22)

2011年(36)

分类:

2012-02-25 06:47:16

原文地址:Linux时间编程 作者:xgmiao

一、时间的类型
(1)格林威治标准时间
   Coordinated Universal Time(UTC)是世界标准时间,即常说的格林威治标准时间(Greenwich Mean Time,GMT).
  
:格林威治时间和本地时间不同
.
(2)日历时间

   日历时间(Calendar Time)是用"一个标准时间点(1970110)到此时经过的秒数"来表示的时间

二、与时间有关的结构

(1): struct tm
    {
      int tm_sec;   //秒值

      int tm_min;   //
分钟值
      int tm_hour;  //
小时值
      int tm_mday;  //
本月第几日
      int tm_mon;   //
本年第几月
      int tm_year;  //tm_year+1900=
哪一年
      int tm_wday;  //
本周第几日
      int tm_yday;  //
本年第几日
      int tm_isdst; //
日光节约时间
    }

(2):struct timeval
    {
       time_t tv_sec;    //秒数
       long   tv_usec;   //
微秒数
    }

(3):struct timespec

    {

       time_t tv_sec;    //秒数

       long   tv_nsec;   //纳秒

    }
三、时间函数的API

  
时间函数的API均属于系统调用函数.
(1)获取日历时间

   #include
  
time_t time(time_t *tloc)
   函数功能:获取日历时间,即从1970110点到现在所经历的秒数
.
  
参数:如果不为空,则时间值也存放在由tloc指向的单元内。

  
例程
:

  1. #include<stdio.h>
  2. #include<time.h>
  3. void main()
  4. {
  5.     int seconds=0;
  6.     seconds = time((time_t *)NULL);
  7.     printf("seconds=%d\n",seconds);
  8. }

   执行结果:
   seconds=1287902909
   Attention!!!
  
通常用户得到日历时间的秒数没有实际的意义,但可以为时间转化做一些铺垫性质的工作.为了更好的利用时间,用户需要将这些秒数转化为更容易接受的时间表示方式,这些表示时间的方式有格林威治时间、本地时间等
.
(2)将日历时间转换为格林威治标准时间

   struct tm *gmtime(const time_t *timep)
   函数功能:将日历时间转化为格林威治标准时间,并保存在tm结构

  
参数:日历时间的返回值
(3)将日历时间转化为本地时间
   struct tm* localtime(const time_t *timep)
   函数功能:将日历时间转化为本地时间,并保存至tm结构

  
参数:日历时间的返回值
   Attention!!!
  
由上面两个函数可以看出,这两个函数的返回值均存放在tm结构中。 

   time.c       

  1. #include <stdio.h>
  2. #include <time.h>
  3. int main(void)
  4. {
  5.     struct tm *local;
  6.     time_t t;
  7.     t = time(NULL); //获取日历时间
  8.     local = localtime(&t); //将日历时间转化为本地时间,并保存在struct tm结构中
  9.     printf("local hour is :%d\n",local->tm_hour);
  10.     local = gmtime(&t); //将日历时间转化为格林威治时间,并保存在struct tm结构中
  11.     printf("UTC hour is :%d\n",local->tm_hour);
  12.     return 0;
  13. }

   执行结果:
   [root@localhost lishuai]# gcc time.c -o time -Wall
   [root@localhost lishuai]# date   //
获取Linux系统的当前时间

   Mon Dec 14  03:27:16  CST 2009
   [root@localhost lishuai]# ./time
   local hour is : 3    //(Linux
系统的)当前时间是3
   UTC hour is : 19     //
格林威治时间是19 
   Attention!!!
  
利用函数gmtime()localtime()可以将日历时间转化为格林威治时间和本地时间,虽然用户可通过结构体tm来获取这些时间值,但看起来还不方便,最好是将所有的信息,如年、月、日、星期、时、分、秒以字符串的形式显示出来,这样就加直观
.
(4)将日历时间转化为本地时间的字符串形式

   char *ctime(const time_t *timep)
   函数功能:将日历时间转化为本地时间的字符串形式

  
参数:日历时间的返回值
   Attention!!!
  
该函数较asctime()使用起来更加简单.必须按照下面2个步骤来进行.
   <1>
使用函数time()来获取日历时间

   <2>
使用函数ctime()将日历时间直接转化为字符串
(5)将格林威治时间转化为字符串
  
char *asctime(const struct tm *tm)
   函数功能:tm格式的时间转化为字符串

  
参数:日历时间的返回值
  
例如: Sat Jul 30 08:43:03 2005
   Attention!!!
  
该函数较ctime()使用起来更加的复杂.必须按照下面3个步骤来进行
.
   <1>
使用函数time()来获取日历时间

   <2>
使用函数gmtime()将日历时间转化为格林威治标准时间
   <3>
使用函数asctime()tm格式的时间转化为字符串
  
例程:

  1. #include <time.h>
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5.     struct tm *ptr;
  6.     time_t lt;
  7.     lt=time(NULL);
  8.     ptr=gmtime(&lt);
  9.     printf(asctime(ptr));
  10.     printf(ctime(&lt));
  11.     return 0;
  12. }

(6)获取从今日凌晨到现在的时间差
  
int gettimeofday(struct timeval *tv,struct timezone *tz)
   函数功能:获取从今日凌晨(0:0:0)到现在的时间差,常用于计算事件耗时

  
参数1:存放从今日凌晨(0:0:0)到现在的时间差,时间差以秒或微秒为单位,以timeval结构形式存放。
   
参数2:常设置为NULL
  
函数用法:可以在做某件事情之前调用gettimeofday(),在做完该件事情之后调用gettimeofday(),两个函数的参数1的差就是做该事情所消耗的时间
.
  
例程:计算函数function()的耗时

   
time.c

  1. #include <sys/time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. void function()
  6. {    
  7.     unsigned int i,j;
  8.     double y;
  9.     for(i=0;i<1000;i++)
  10.         for(j=0;j<1000;j++)
  11.             y++;
  12. }
  13. void main()
  14. {
  15.     struct timeval tpstart,tpend;
  16.     float timeuse;
  17.     gettimeofday(&tpstart,NULL); // 开始时间
  18.     function();
  19.     gettimeofday(&tpend,NULL); // 结束时间
  20.     timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
  21.     timeuse/=1000000;
  22.     printf("Used Time:%f\n",timeuse);
  23.     exit(0);
  24. }

 执行结果:
 [root@localhost lishuai]# gcc time.c -o time -Wall
 [root@localhost lishuai]# ./time
    Use Time:0.006288
(7)延时函数

   <1>使程序睡眠seconds
     
unsigned int sleep(unsigned int seconds)
   函数功能:使程序睡眠seconds

  
参数:需要休眠的秒数
   <2>
使程序睡眠usec微秒
     
void usleep(unsigned long usec)
   函数功能:使程序睡眠usec微秒

  
参数:需要休眠的秒数

 

阅读(838) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~