linux应用编程笔记(7)时间编程

本文详细介绍了Linux环境下时间编程的基本概念,包括林威治时间、日历时间及其转换方式,通过实例演示如何获取和格式化显示时间,以及如何进行高精度时间计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:介绍了Linux下时间编程的两个时间类型,以及常用的api函数和用法,最后用一个例子进行了加深理解。


一、两个时间类型

    1.格林威治时间:Coordinated Universal Time(UTC)是世界标准时间,即常说的格林威治标准时间(GreenwichMean Time,GMT).格林威治时间和我们本地时间是不一样的。

    2.日历时间:日历时间(Calendar Time)是用"一个标准时间点(如1970年1月1日0点)到此时经过的秒数"来表示的时间.


二、获取日历时间

    函数原型:time_t time(time_t *t);

    头文件:include <time.h>

    函数功能:获取日历时间,即从1970年1月1日0点到现在所经历的秒数.

    返回值:成功则返回秒数,失败返回-1.

    参数:通常设置为NULL

    一般来说,我们得到一堆秒数是没有多大用处的,但是我们可以通过程序进一步的利用这个时间,转化为我们需要的时间,所以这是一个基础性的工作。


三、获取格林威治时间

    函数原型:struct tm *gmtime(const time_t *timep)

    头文件:include <time.h>

    函数功能:将日历时间转化为格林威治标准时间,并保存在tm结构

    返回值:格林威治时间,失败返回-1

    参数:日历时间的返回值

    tm结构如下:

      struct tm {

               int tm_sec;         /* seconds */

               int tm_min;         /* minutes */

               int tm_hour;        /* hours */

               int tm_mday;        /* day of the month */

               int tm_mon;         /* month */

               int tm_year;        /* year */

               int tm_wday;        /* day of the week */

               int tm_yday;        /* day in the year */

               int tm_isdst;       /* daylight saving time */

          };

    这里面存放了详细的获取的从年份到秒数时间信息,下面的localtime获取的时间也是存放在这个结构体里面。


四、获取本地时间

    函数原型:struct tm* localtime(const time_t *timep)

    头文件:include <time.h>

    函数功能:将日历时间转化为本地时间,并保存至tm结构。

    返回值:本地时间,失败返回-1.

    参数:日历时间的返回值。

    利用函数gmtime()、localtime()可以将日历时间转化为格林威治时间和本地时间,虽然用户可通过结构体tm来获取这些时间值,但是和我们使用date看起来的时间还是很别扭,所以下面就来处理这个问题。


五、格式化显示时间

    1.将日历时间转化为本地时间的字符串形式

    函数原型:char*ctime(const time_t *timep)
    头文件:include <time.h>

    函数功能:将日历时间转化为本地时间的字符串形式
    参数:日历时间的返回值

    使用步骤:

    第一步:使用函数time()来获取日历时间。

    第二步:使用函数ctime()将日历时间直接转化为字符串。

 

   2.将格林威治时间转化为本地时间的字符串形式

    函数原型:char*asctime(const struct tm *tm)
    头文件:include <time.h>

    函数功能:将tm格式的时间转化为字符串
    参数:日历时间的返回值

    使用步骤:

    第一步:使用函数time()来获取日历时间。

    第二步:使用函数gmtime()将日历时间转化为格林威治标准时间。

    第三步:使用函数asctime()将tm格式的时间转化为字符串。


六、获取高精度的时间

    函数原型:intgettimeofday(struct timeval *tv,struct timezone *tz)
    头文件:include <time.h>

    函数功能:获取从今日凌晨(0:0:0)到现在的时间差,常用于计算事件耗时
    参数1:存放从今日凌晨(0:0:0)到现在的时间差,时间差以秒或微秒为单位,以结构体形式存放
    struct timeval
    {
       int tv_sec; //秒数
       int tv_usec; //微秒数
    }
    参数2:常设置为NULL
    函数用法:可以在做某件事情之前调用gettimeofday(),在做完该件事情之后调用gettimeofday(),两个函数的参数1的差就是做该事情所消耗的时间.


七、例程验证上述函数

    下面编写一个程序,命名为time.c,里面将上述提到的api函数都使用一边,加深理解,例程内容如下:

<span style="font-size:18px;">#include <stdio.h>
#include <time.h>
#include <sys/time.h>//这个头文件如果不加定义timeval结构体变量的时候会报错,存储未分配

struct tm *l_time;//定义一个tm结构体,后面用来存放获取的本地时间信息
struct tm *g_time;//定义一个tm结构体,后面用来存放获取的格林威治时间信息
time_t t;//t为time_t变量


float timeuse;

void fun(void)//测试函数,用于验证函数运行时间
{
int i,j,k;
for(i=0;i<1000;i++)
	for(j=1000;j<0;j++)
		{
			k++;
			if(k>10000)
				k=0;
			}
	
}

int main(void)
{
	struct timeval t_start;
	struct timeval t_end;

/*获取日历时间*/
	t=time(NULL);//获取到的是日历时间
	printf("%d\n",t);//打印出来是秒数
	
/*获取本地时间*/	
	l_time=localtime(&t);//获取本地时间,存放到l_time结构体里面
	printf("local hour is :%d\n",l_time->tm_hour);//将本地时间的小时打印出来

/*获取格林威治时间*/	
	g_time=gmtime(&t);//获取格林威治时间,存放到g_time结构体里面
	printf("UTC hour is :%d\n",g_time->tm_hour);//将格林威治时间的小时打印出来
	
/*格式化显示本地和格林威治时间*/		
	printf("%s\n",asctime(g_time));//格式化显示格林威治时间,使用上面得到的g_time
	
	printf("%s\n",ctime(&t));//格式化显示本地时间,这里的参数是time_t类型的t
	
	
/*精确获取时间计算函数执行时间*/	
	gettimeofday(&t_start,NULL);//得到现在的其实时间,放在t_start的timeval结构体中
	fun();
	gettimeofday(&t_end,NULL);//得到结束时间,放在t_end的timeval的结构体中
	
	timeuse=1000000*(t_end.tv_sec-t_start.tv_sec)+(t_end.tv_usec-t_start.tv_usec);
  timeuse/=1000000;
  printf("The fun use time:%f\n",timeuse);//将时间转换成秒。因为1秒等于1000000微妙

	return 0;	
}</span>

    编译运行之后结果如下:

    1444465358

    local hour is :16

    UTC hour is :8

    Sat Oct 10 08:22:38 2015

 

    Sat Oct 10 16:22:38 2015

 

    The fun use time:0.000004

    这篇帖子就总结到这里,如有不正确的地方还请指出,大家共同进步!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值