Linux C编程第五回 - 时间函数

时间函数其实也是实际编程中经常需要用到的,虽然说需要的时候可以再查,但是提前了解一下大概,以后找起来也会很方便的,所以这里也总结一下,涉及到的函数不多,一切以实用为目的。

头文件<time.h>,这个是C标准库的头文件。

1. 用于随机函数的随机种子;

获取当前时间,精确到秒,: time_t time( time_t *t );

time_t实际就是int,代表从1970年1月1号到现在的秒数,时区为UTC时区。

2. 用于写日志等需求时,需要获取人类时间:

前边这个时间人类是没有办法看懂的,所以我们需要将他转换为人类能够看懂的时间:

struct  tm * gmtime( time_t *t );  //依旧保留UTC时间

struct  tm * localtime( time_t *t );//转换为本地时区的时间

tm的结构比较复杂,时分秒,月日年都包含了

struct tm {
int tm_sec; /* Seconds (0-60) 查了一下Linux接口说明,之所以有60,是因为有闰秒的存在*/
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) 这里不知道怎么回事,不是0-30?*/
int tm_mon; /* Month (0-11) */
int tm_year; /* Year since 1900 */
int tm_wday; /* Day of the week (Sunday = 0)*/
int tm_yday; /* Day in the year (0-365; 1 Jan = 0)*/
int tm_isdst; /* Daylight saving time flag
		> 0: DST is in effect;
		= 0: DST is not effect;
		< 0: DST information not available */
};

3.转换成我们需要的时间格式:

有两个简单的函数,还有一个比较复杂的函数,当然也可以自己用第二种得到时间用sprintf来自己转换成自己的时间格式。

简单函数:

char *ctime( time_t *t );

char *asctime( struct tm *timeptr );

比较复杂的这个,到不是说函数有多复杂,主要是参数和预设值比较多,参数和sprinf也很像,方便的是提供很多类似于sprintf里边的%d, %f等预设值。

常用的有时%H,分%M,秒%S,月%m, 日%d, 年%y(后两位)%Y(四位),另外还可以显示出Monday的%A,更多的就不列举了,需要的时候再查标准库吧。

size_t strftime(
  char *strDest,
  size_t maxsize,
  const char *format,
  const struct tm *timeptr
  );

4.调试程序性能的时候需要比较精确的时间来记录代码段执行的时间长短,从而找出二八原理中的耗时80%的代码段。

这个函数不是标准C里边的了,是Linux的内核函数,第二个参数在Linux接口书上让一直传NULL。

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

struct timeval {
time_t tv_sec;
suseconds_t tv_usec; 
};


#include <stdio.h>
#include <time.h>
#include <sys/time.h>

int main( int argc, char *argv[] )
{
  time_t curTime = time( NULL );
  printf( "current sec time: %ld, size: %d\n", curTime , sizeof( curTime ) );

  struct tm *gTime = gmtime( &curTime );
  printf( "Global time: %s\n", asctime( gTime ) );
  struct tm *lTime = localtime( &curTime );
  printf( "Current time: %s\n", asctime( lTime ) );

  char date_today[30] = {0};
  strftime( date_today, 30, "Today is %A!", lTime );
  printf("%s\n", date_today);
  
  struct timeval tv1;
  struct timeval tv2;
  gettimeofday( &tv1, NULL );
  int i;
  for( i=0; i<100000000; i++ )
    {
      i++;
    }
  gettimeofday( &tv2, NULL );

  int usec = tv2.tv_usec - tv1.tv_usec;
  if ( usec < 0 )
    {
      usec += 1000000;
      tv2.tv_sec -= 1;
    }
  int sec = tv2.tv_sec - tv1.tv_sec;
  printf( "1000000 + time is:\"%d\"sec\"%d\"usec\n", sec,usec );

}
/*运行结果
[chenndao@localhost source]$ gcc -o time time.c
[chenndao@localhost source]$ ./time
current sec time: 1354570334, size: 4
Global time: Mon Dec  3 21:32:14 2012




Current time: Tue Dec  4 05:32:14 2012




Today is Tuesday!
1000000 + time is:"0"sec"333512"usec
[chenndao@localhost source]$ date
Tue Dec  4 05:32:35 CST 2012
[chenndao@localhost source]$ */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值