本帖最后由 yuanlai2010 于 2014-8-12 09:45 编辑
时间编程
参与Helper2416开发板助学计划心得
格林尼治时间(Greenwich Mean):亦称“世界时”。格林尼治所在地的标准时间。不光是天文学家使用格林尼治时间,就是在新闻报刊上也经常出现这个名词。我们知道各地都有各地的地方时间。如果对国际上某一重大事情,用地方时间来记录,就会感到复杂不便。而且将来日子一长容易搞错。因此,天文学家就提出一个大家都能接受且又方便的记录方法,那就是以格林尼治的地方时间为标准。格林尼治是英国伦敦南郊原格林尼治天文台的所在地,它又是世界上地理经度的起始点。对于世界上发生的重大事件,都以格林尼治的地方时间记录下来。一旦知道了格林尼治时间,人们就很容易推算出相当的本地时间。例如,某事件发生在格林尼治时间上午8 时,中国在英国东面,北京时间比格林尼治时间早8小时,我们就立刻知道这次事情发生在相当于北京时间16时,也就是北京时间下午4时,即从东+8个时区,加8个小时。
日历时间:是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。
这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点(一般是1970年1月1日0时0分0秒)来说,日历时间都是一样的。
几个可能会用到的和时间有关的函数:
获取日历时间:
函数原型: time_t time(time_t *timer)
函数功能: 得到系统当前时间,从标准计时点(一般是1970年1月1日午夜)到当前时间的秒数。
函数返回: 系统当前时间
参数说明: timer=NULL时得到机器日历时间,timer为有效指针时,更新timer为系统当前时间,time_t是一个long类型
转换时间:
转换为本地时间:
函数原型: struct tm *localtime(const time_t*timer)
函数功能: 返回一个以tm结构表达的机器时间信息
函数返回: 以tm结构表达的时间,结构tm定义如下:
- struct tm{
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year;
- int tm_wday;
- int tm_yday;
- int tm_isdst;
- };
复制代码参数说明: timer-使用time()函数获得的机器时间
所属文件:
转换为格林尼治时间:
函数原型: struct tm *gmtime(time_t *time)
函数功能: 得到以结构tm表示的时间信息
函数返回: 以结构tm表示的时间信息指针
参数说明: time-用函数time()得到的时间信息
所属文件:
时间显示:
在上面的函数中得到的都是数据,并不能直接用于显示,为了更加直观的显示可以通过以下的函数转换成字符串,直接显示出来:
将tm格式的时间转换为字符串:
函数原型: char* asctime(struct tm * ptr)
函数功能: 得到机器时间(日期时间转换为ASCII码)
函数返回: 返回的时间字符串格式为:星期,月,日,小时:分:秒,年
参数说明: 结构指针ptr应通过函数localtime()和gmtime()得到
将日历时间转换为字符串:
函数原型: char *ctime(const time_t *time)
函数功能: 得到日历时间
函数返回: 返回字符串格式:星期,月,日,小时:分:秒,年
参数说明: time-该参数应由函数time获得
所属文件:
以上几个函数的综合实例:
- #include <time.h>
- #include <stdio.h>
- int main()
- {
- time_t t;
- struct tm *gmt,*area;
- t = time(NULL);
- printf("the GMT is: %s",ctime(&t));
- area = localtime(&t);
- printf("Localtime is: %s",asctime(area));
- gmt = gmtime(&t);
- printf("GMT is: %s",asctime(gmt));
- return 0;
- }
复制代码运行结果
- [Linux@CentOS time]$ gcc time.c -o time_x86
- [Linux@CentOS time]$ ./time_x86
- the GMT is: Tue Aug 12 09:20:51 2014
- Localtime is: Tue Aug 12 09:20:51 2014
- GMT is: Tue Aug 12 01:20:51 2014
- [Linux@CentOS time]$
复制代码
一个获取今天凌晨到现在的时间差的函数,可以用于计算事件耗时:
函数原型:int gettimeofday(struct timeval*tv, struct timezone *tz)
函数功能:获取从今日凌晨到现在的时间差
函数返回:执行成功时返回0
参数说明:tv是保存获取时间结果的结构体,参数tz用于保存时区结果(一般这个参数不使用,传NULL),timeval的结构如下:
- Struct timeval {
- long int tv_sec; // 秒数
- long int tv_usec; // 微秒数
- };
复制代码所属文件:
它获得的时间精确到微秒(1e-6 s)量级。在一段代码前后分别使用gettimeofday可以计算代码执行时间:
代码实例:
- #include <sys/time.h>
- #include <stdio.h>
- void delay()
- {
- unsigned int i,j;
- for(i=0;i<10000;i++)
- {
- for(j=0;j<10000;j++);
- }
- }
- int main()
- {
- struct timeval tv_begin, tv_end;
- unsigned int timeuse;
- gettimeofday(&tv_begin, NULL);
- delay();
- gettimeofday(&tv_end, NULL);
- timeuse = 1000000*(tv_end.tv_sec - tv_begin.tv_sec)+
- (tv_end.tv_usec - tv_begin.tv_usec);
- printf("Used time:%d us \n",timeuse);
- return 0;
- }
复制代码运行结果:
- [Linux@CentOS gettimeofdate]$ gcc gettimeofdate.c -o gettimeofdate
- [Linux@CentOS gettimeofdate]$ ./gettimeofdate
- Used time:315758 us
- [Linux@CentOS gettimeofdate]$
复制代码
Linux C程序中常用的延时函数
函数原型: unsigned intsleep(unsigned int seconds)
函数功能: 使程序睡眠seconds秒
函数返回: 执行成功则返回0
参数说明: seconds指定秒数
所属文件:
函数原型: void usleep(unsigned long usec)
函数功能: 使程序睡眠usec微秒
函数返回: 空
参数说明: usec指定微秒数
所属文件:
闹钟函数alarm:
函数原型: unsigned int alarm(unsigned int seconds);
函数功能: 使程序睡眠usec微秒
函数返回: 成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
参数说明: seconds:指定秒数
所属文件:
alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。如果忽略或者不捕获此信号,则其默认动作是终止调用该alarm函数的进程。
要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。需要注意的是,经过指定的秒数后,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一些时间。
如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。
论坛ID:yuanlai2010
发表时间:2014-08-12