摘要:介绍了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
这篇帖子就总结到这里,如有不正确的地方还请指出,大家共同进步!