4105|2

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-31——Linux_Programing——时间编程 [复制链接]

本帖最后由 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定义如下:
  1. struct tm{
  2.                 int tm_sec;
  3.                 int tm_min;
  4.                 int tm_hour;
  5.                 int tm_mday;
  6.                 int tm_mon;
  7.                 int tm_year;
  8.                 int tm_wday;
  9.                 int tm_yday;
  10.                 int tm_isdst;
  11.                 };
复制代码
参数说明: 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获得
所属文件:


以上几个函数的综合实例:
  1. #include <time.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.         time_t t;
  6.         struct tm *gmt,*area;

  7.         t = time(NULL);
  8.         printf("the GMT is: %s",ctime(&t));

  9.         area = localtime(&t);
  10.         printf("Localtime is: %s",asctime(area));

  11.         gmt = gmtime(&t);
  12.         printf("GMT is: %s",asctime(gmt));

  13.         return 0;
  14. }
复制代码
运行结果
  1. [Linux@CentOS time]$ gcc time.c -o time_x86
  2. [Linux@CentOS time]$ ./time_x86
  3. the GMT is: Tue Aug 12 09:20:51 2014
  4. Localtime is: Tue Aug 12 09:20:51 2014
  5. GMT is: Tue Aug 12 01:20:51 2014
  6. [Linux@CentOS time]$
复制代码



一个获取今天凌晨到现在的时间差的函数,可以用于计算事件耗时:
       函数原型:int gettimeofday(struct timeval*tv, struct timezone *tz)
       函数功能:获取从今日凌晨到现在的时间差
       函数返回:执行成功时返回0
       参数说明:tv是保存获取时间结果的结构体,参数tz用于保存时区结果(一般这个参数不使用,传NULL),timeval的结构如下:
  1. Struct timeval {
  2.                                 long int tv_sec; // 秒数
  3.                                 long int tv_usec; // 微秒数
  4.                                 };
复制代码
所属文件:

它获得的时间精确到微秒(1e-6 s)量级。在一段代码前后分别使用gettimeofday可以计算代码执行时间:

代码实例:
  1. #include <sys/time.h>
  2. #include <stdio.h>

  3. void delay()
  4. {
  5.         unsigned int i,j;
  6.         for(i=0;i<10000;i++)
  7.         {
  8.                 for(j=0;j<10000;j++);
  9.         }
  10. }

  11. int main()
  12. {
  13.         struct timeval tv_begin, tv_end;
  14.         unsigned int timeuse;

  15.         gettimeofday(&tv_begin, NULL);
  16.         delay();
  17.         gettimeofday(&tv_end, NULL);

  18.         timeuse = 1000000*(tv_end.tv_sec - tv_begin.tv_sec)+
  19.                   (tv_end.tv_usec - tv_begin.tv_usec);
  20.         printf("Used time:%d us \n",timeuse);
  21.         return 0;
  22. }
复制代码
运行结果:
  1. [Linux@CentOS gettimeofdate]$ gcc gettimeofdate.c -o gettimeofdate
  2. [Linux@CentOS gettimeofdate]$ ./gettimeofdate
  3. Used time:315758 us
  4. [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

最新回复

yuanlai2010的贴子写得很漂亮!值得大家学习!另外,说明一下,HELPER2416暂未实现hrtimer,不支持高精度定时。  详情 回复 发表于 2014-8-12 10:56
点赞 关注

回复
举报

554

帖子

0

TA的资源

版主

沙发
 
yuanlai2010的贴子写得很漂亮!值得大家学习!另外,说明一下,HELPER2416暂未实现hrtimer,不支持高精度定时。

点评

多谢BOSS的赞扬!  详情 回复 发表于 2014-8-12 12:14
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
spacexplorer 发表于 2014-8-12 10:56
yuanlai2010的贴子写得很漂亮!值得大家学习!另外,说明一下,HELPER2416暂未实现hrtimer,不支持高精度定 ...

多谢BOSS的赞扬!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表