完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 michael_llh 于 2016-8-16 14:50 编辑
首先我们要知道时间的两个不同的概念: GMT时间: 格林尼治标准时间是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,我们常说的世界时就是指的这个时间。 UTC时间: 协调世界时(英:Coordinated Universal time ),又称世界统一时间,世界标准时间,国际协调时间。简称UTC。。 那么我们的互联网和万维网中使用的时间就是运用UTC来标记的。我们在Linux底下使用的时间计数就是使用UTC时间来进行标记的。 关于这两个时间的区别和相关的计算可以参考朱有鹏老师推荐的这篇文章: http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html 下面我们来谈谈另外一个问题,就是点时间和段时间的区别。点时间的话指的就是一个点的时间,这个其实很好理解,我们在时间这个维度上面,比如有一个时间轴,那么这个点时间就是上面的一个点,比如说几点几分几秒,段时间也很好理解,就是一段时间,就是我们时间轴上面的一个线段长度的时间。段时间就等于两个点时间的差值的绝对值。 还有两个概念: 定时器:顾名思义就是定时一段时间,也就是说一段时间之后做一些什么事情,这里指的就是一个段时间 实时时钟:这个指的就是一个点时间 在Linux内核当中我们说对于时间的计数,他有一个jiffies变量,这个变量是一个全局变量,用来记录以jiffies单位长度的一个数值,这个数值通常是比较大的。每次开机这个变量会有一个初始值,每一个内核节拍jiffies值就加1. 那么在Linux当中我们如何记录时间呢?首先内核在开机的时候会从RTC实时时钟当中读取一个时间作为初始时间,那么这个时间该如何来转换成jiffies值,用这个时间减去我们的基准起点,1970-01-01 00:00:00 +0000,然后得到的时间段作为我们的jiffies值。 也就是说操作系统只在我们系统开机的时候读取一次RTC的值,之后运行过程中,Linux是自己在软件上进行时间的累计,不再去读取RTC的值,所以RTC的作用我们就可以在这里知道,就是用来保存我们计算机两次开机之间关机的时间的计时。从而保证我们每次开机的时候时间都是正确的。 那么我们这里说的一个系统节拍,时间会是多少呢?这个取决于不同的操作系统有不同的定义,现代的Linux操作系统一般是10ms或者是1ms作为内核节拍的时间。这个时间就是我们说的调度时间,在一些嵌入式的操作系统包括我们说的Ucos、RT-thread、RTOS等等这些系统中我们会说到一个调度时间,这个概念是很重要的。Linux内核当中用Hz来表示这个时间,这个也很好理解,1000Hz就是1ms,100Hz就是10ms了。 我们常用的和时间相关的API函数或者是库函数有: time、ctime、localtime、gmtime、mktime、asctime time函数调用之后我们会得到一个数值,这个数值是以秒为单位的距离1970-01-01 00:00:00 +0000(UTC)的一个时间段。 gmtime和localtime会把time得到的秒数转换成一个结构体struct tm,结构体中有很多的元素包括我们的年月日,时分秒等等。这里的gmtime表示的时间是国际时间,而localtime顾名思义就是我们的本地时间了。 从struct tm出发转换成得到一个字符串时间我们可以通过asctime或者strftime都可以。 time返回的值是一个time_t类型的,这其实就是一个长整型的数字,但是为了统一和函数的规范性,这里其实对他进行了一个宏定义的过程。从time_t出发得到一个字符串的时间输出我们可以用ctime函数就可以了。这种方法是最简便的,但是有一个不好的地方,就是这样我们得到的时间格式是固定,也就说在ctime函数中已经将这个格式限定死了,所以我们想要得到自己的时间格式就要选择其他的函数来实现。并且ctime是结合了我们的本地时间进行计算的,所以我们调用的时候最终得到的都是我们的本地时间。 △函数名中参数没有const表示它是一个输出型的参数。 strftime就可以根据我们的需要进行输出,他的输出方式和我们的printf有点类似,比如说我们的%d表示的整型的变量输出,对比到我们的strftime中就是%m就是我们的月份输出,就是类似这样的一个形式,我们可以通过man手册中具体查到这些内容。 gettimeofday中我们是可以得到一个以us为单位的时间,而其他的函数我们得到的结果都是以秒为单位,所以如果我们在程序中需要得到一个精度比较高的时间的话我们就需要选择这个函数。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4899 浏览 0 评论
87419 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4730 浏览 2 评论
3626 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2486 浏览 0 评论
2006浏览 3评论
1292浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1347浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1238浏览 0评论
1178浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 16:06 , Processed in 2.627008 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号