1. 格林尼治时间、协调世界时 间、世界时间、日光节约时间以及时区等介绍:

      格林尼治时间(Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的标准时间,因为本初子午线被定义为通过那里的经线。格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。
      在刚开始的几十年,GMT 的测量方法非常简单。观测者随时监控太阳在天空的位置,并且把每天太阳爬升到仰角最高的时候记录下来,这个时间点称呼为“过中天”。一般人对于一天 24 小时的理解,大致上就相等于两次太阳过中天的时间间隔。不过由于地球是以椭圆轨道绕着太阳,在轨道上的行进速率不一,导致一年之中会有“比较长的一天”与“比较短的一天”,所以格林威治的观测者必须要至少连续观测一年,然后求取365 个长度不一的“天”,再把他们全部平均后,得到固定的一天长度,之后再细分成时、分、秒等单位。这个就是 GMT。
      近几十年来有了更稳定的观测GMT或是说观测太阳日的方法,那就是利用宇宙中稳定一致的无线电波源周期性的讯号,搭配电波源抵达地球时观测的角度,直接计算地球的自转与公转速率,再以此计算一年、一天、时分秒的平均长度。这些观测由高科技的天文台、卫星等来负责,跟格林威治天文台的观测没有关系。以此标准得到的时间成为世界时间(Universal Time,UT)。 世界时有三种版本,UT0、UT1 和UT2。UT0 是最原始的观测结果计算值,UT1 则是修正了地球在长时间尺度下会产生的自转轴漂移的影响的计算值,UT2 则是为了研究需求比UT1 多修正了季节性影响计算值。 GMT 跟UT1 测量的概念基本相同,都是长时间尺度下的平均太阳日。
      另外一方面,自从 1967 年国际度量衡大会把秒的定义改成铯原子进行固定震荡次数的时间后,时间的测量就可以与星球的自转脱节了。只利用原子钟计算时间与日期的系统,称作国际原子时 (International Atomic Time),这是一种只有天的系统,时分秒都以天的小数点零头来表示。以国际原子时为计算基准,把时间格式与 UT1 对齐,让一般人都方便使用的时间系统,就叫做协调世界时 间(Coordinated Universal Time, UTC)。这也就是 UTC 为什么与 GMT 几乎一样的关系。由于 UTC 直接与国际度量衡标准相联系,所以目前所有的国际通讯系统,像是卫星、航空、GPS 等等,全部都协议采用 UTC 时间。
      但是,透过原子钟 (UTC)模拟平均太阳日,会出现一个很严重的问题:由于地球的自转正在缓慢减速,导致平均太阳日会逐渐变长。也就是说,GMT 的一秒会越来越久,但是只要我们不改度量衡对于秒的定义,那么 UTC 的一秒就会始终如一。长久下来,UTC 一定会超前 GMT 一秒以上,而且会越来越多!因此,目前负责管理UTC 的专责机构──国际地球自转服务(International Earth Rotation and Reference Systems Service,又称为IERS)决定在UTC 超前GMT 快一秒时,选择适当的时间加入闰秒,来抵销超前的量。
      时区: 地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。为了克服时间上的混乱,因而产生了时区的概念。国际上规定,把通过英国格林尼治天文台原址的那条经线,叫做0°经线。规定将全球划分为24个时区(中时区、东、西各11个时区以及东西12区)。格林尼治天文台旧址为中时区(零时区,0度经线东西各延伸7.5度)。随后东1到11区,西1到11区的每个时区横跨经度15度。东西12区以东、西经180度为界,各跨经度7.5度。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。这样一来以GMT时间或UTC时间为基准,加减相应的小时数就可以得到当地时间。
      日光节约时间(Daylight Saving Time):一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮较早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家规定不同。

  2. 相关时间和时区总结

       格林尼治时间(Greenwich Mean Time,GMT)以英国伦敦郊区的皇家格林尼治天文台观测到的太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的平均值来作为时间的基准。但是这种观测会有一定的误差。世界时(Universal Time,UT)与GMT的测量观念相同,只是世界时(Universal Time,UT)采用了现代科学的一些最新技术,降低了测量的误差。不同也是以测量的值为时间基准。而协调世界时 (Coordinated Universal Time, UTC)完全摆脱了测量值,而以铯原子进行固定震荡次数作为时间基准,因此也产生了加入闰秒的操作。这几种时间类型的基准不大相同,但是我觉得时区的概念还是相同的。不管英国伦敦格林尼治的时间计算以哪种时间为基准,北京时间都是英国伦敦格林尼治的时间向后推8个小时,因为全球就是24个时区,当然这是我的理解。也就是说GMT、UTC只是计算时间的一个基准。

  3. struct timeval结构体、struct timezone结构体定义以及gettimeofday函数声明:

    
    #include<sys/time.h> /* 需要的头文件 */int gettimeofday(struct timeval * tv,struct timezone * tz);/* 函数声明 */
    struct timeval
    {
    time_t      tv_sec;     /* 秒 */
    suseconds_t tv_usec;    /* 微秒 */
    };
    struct timezone
    {int tz_minuteswest;     /* (minutes west of Greenwich),按我的理解,此数据项的含义是当地时间以格林威治时间为基准向西算的分钟数。 */int tz_dsttime;         /* (type of DST correction),按字面理解是日光节约时间的修正方式 */
    };
  4. 函数调用返回值及数据域说明

      调用函数gettimeofday成功返回0,失败返回-1。调用函数gettimeofday之后将得到从linux epoch(1970年1月1日0点0分0秒,UTC格林威治时间)算起的总秒和微秒数。结构体struct timeval中tv_sec存储秒数,tv_usec存储微秒数。time_t和suseconds_t实际是一个长整型,由于长整型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC时间)。为了能够表示更久远的时间,可用64位或更长的整形数来保存日历时间,这里不作详述。而时区信息将存储在struct timezone结构体中,但是linux系统已经基本不再使用。在调用gettimeofday函数之后该结构体中的数据项均为0值。其中tz_dsttime数据项应该是一个数据常量,表示一年中的那一部分启用日光节约时间。该常量不表示正在启用日光节约时间,而表示一种算法。同时人们也发现启用日光节约时间的时间段不能完全有某一个算法决定,而是还由其它一些因素,比如政治因素,决定。因此在linux系统中表示时区的方法已经被放弃。对于该部分的介绍我参考的是linux man gettimeofday 的手册页。摘录如下:

    The tz_dsttime field:On  a  non-Linux kernel, with glibc, the tz_dsttime field of struct timezone will be set to a nonzero value by gettimeofday() if the current timezone has ever had or will have a daylight saving rule applied.  In this sense it exactly mirrors the meaning of daylight(3) for the current zone.  On Linux, with glibc, the setting of the tz_dsttime field of struct timezone has never been used by settimeofday() or gettimeofday().  Thus, the following is purely of historical interest.  On old systems, the field tz_dsttime contains a symbolic constant (values are given below) that indicates in which part of the year Daylight Saving  Time  is in force.  (Note: this value is constant throughout the year: it does not indicate that DST is in force, it just selects an algorithm.)  The daylight saving time algorithms defined are as follows:DST_NONE     /* not on DST */DST_USA      /* USA style DST */DST_AUST     /* Australian style DST */DST_WET      /* Western European DST */DST_MET      /* Middle European DST */DST_EET      /* Eastern European DST */DST_CAN      /* Canada */DST_GB       /* Great Britain and Eire */DST_RUM      /* Romania */DST_TUR      /* Turkey */DST_AUSTALT  /* Australian style with shift in 1986 */Of course it turned out that the period in which Daylight Saving Time is in force cannot be given by a simple algorithm,  one  per  country; Indeed, this period is determined by unpredictable political decisions.  So this method of representing timezones has been abandoned.
    
  5. 参考资料:

    1. https://zh.wikipedia.org/wiki/%E6%A0%BC%E6%9E%97%E5%B0%BC%E6%B2%BB%E6%A8%99%E6%BA%96%E6%99%82%E9%96%93

    2. https://zh.wikipedia.org/wiki/%E5%8D%8F%E8%B0%83%E4%B8%96%E7%95%8C%E6%97%B6

    3. https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA

    4. http://pansci.asia/archives/84978

    5. http://jay-fva.blogspot.sg/2010/02/24gmtutc.html

    6. https://baike.baidu.com/item/%E6%97%B6%E5%8C%BA/491122?fr=aladdin

    7. https://zh.wikipedia.org/wiki/%E5%A4%8F%E6%97%B6%E5%88%B6

    8. http://www.wowotech.net/timer_subsystem/time_concept.html

    9. http://blog.csdn.net/water_cow/article/details/7521567

    10. http://blog.csdn.net/lanmolei814/article/details/34115781

    11. http://blog.csdn.net/mybelief321/article/details/8992052

linux系统中struct timeval结构体、struct timezone结构体以及gettimeofday函数相关推荐

  1. linux系统中定时器使用方法,Linux下实现定时器Timer的几种方法

    使用sleep()和usleep() 其中sleep精度是1秒,usleep精度是1微妙,具体代码就不写了.使用这种方法缺点比较明显,在Linux系统中,sleep类函数不能保证精度,尤其在系统负载比 ...

  2. 获取系统信息1——linux系统中的时间

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.关于时间的概念 1.GMT时间 GMT是格林尼治时间,也就是格林尼治地区的当地时间: 用格林尼治的当地时间作为 ...

  3. linux系统中的时间

    1.jiffies的引入 (1)jiffies是Linux中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值. (2)内核配置的时候定义了一个节拍时间,实际上linux内核的调 ...

  4. linux系统中防止系统时间,设置系统时间与在Linux中

    设置系统时间的GPS timestamp_t结构与GPS在Linux的设置系统时间与在Linux中 timestamp_t结构 大家好, 我想,一旦我得到一个succesfull GPS锁定(写代码A ...

  5. linux系统中串口驱动的基本实现原理

    大家好,今天主要和大家聊一聊,如何利用linux系统中的串口驱动. 目录 第一:linux系统中UART驱动框架 第二:uart_ops的具体实现 第三:串口驱动设备树的添加 第一:linux系统中U ...

  6. Linux延时(延迟)函数比较:介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景

    首先,需要了解各个睡眠函数的作用和使用场景. sleep函数用于让进程休眠指定的秒数,适用于需要较长时间的休眠场景: usleep函数用于让进程休眠指定的微秒数,适用于需要较短时间的休眠场景,不精确: ...

  7. Linux系统中消息队列,共享内存、信号和线程的基本操作使用方法

    Linux系统中消息队列,共享内存.信号和线程高级操作 第十一章 消息队列 10.1消息队列定义 10.2 消息队列特点 10.3 key值 10.4 创建消息队列 10.4.1 发送消息 10.4. ...

  8. 通用双向链表的设计(参考Linux系统中的实现)

    通常我们设计设计链表都是将数据域放在里面,这样每次需要使用链表的时候都需要实现一个链表,然后重新实现它的相关操作,这里参考Linux系统中的设计实现了一个通用的双向链表,只需要在你的结构里面有一个这个 ...

  9. LINUX系统中动态链接库的创建与使用

    大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀 的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不 同,它里面的函数并不是执行程序本身的 ...

最新文章

  1. 《系统集成项目管理工程师》必背100个知识点-75配置标识的基本内容
  2. 怎样用命令行生成自己的签名文件keystore
  3. vue2+less开发,使用vux-loader,配置全局less变量
  4. 自学python顺序-python数据结构学习之实现线性表的顺序
  5. LinkedList 注意事项
  6. Javascript:面向对象举例——矩形类及其实例化
  7. 校园网接无线路由器多账号登录
  8. win的反义词_小学英语常用近义词、反义词、同音词汇总 ~~~ 赶紧转给孩子
  9. 百度有啊前端技术初窥
  10. VMware 8安装Mac OS X 10.7
  11. 烈日炎炎,向亲爱的爸爸说声辛苦了
  12. html5 dreamlive,DREAM LIVE 5th Tour Stargazer即将开演
  13. 以太坊开发------Mist使用:合约及部署合约
  14. 包装设计实战案例教学
  15. insmod 加载模块的过程
  16. 机器学习------L1、L2规范化(L1 Regularization、L1 Regularization)
  17. Excel 如何间隔N行取数
  18. RDA1846的驱动程序和频率设定
  19. java获取指定日期所在的周一至周日的日期号数
  20. JavaScript的压缩工具

热门文章

  1. KIR: Kwai Instant Recommend --端上智能在快手上下滑推荐取得APP时长+1%的应用实践
  2. Linux CentOS7 ssh免密钥登录
  3. 罗永浩重返科技圈,却故人难寻
  4. 9000+字,唠唠架构中的设计模式
  5. reactos操作系统实现(47)
  6. B2B网站运营者及优化排名十赌九输-免费套路必是死路
  7. 免费好用的外网映射工具
  8. 原来是这样的稳压二极管
  9. android分析手机唤醒源
  10. 苹果x付款显示服务器异常,怎么解决App Store未完成付款或AppleID登录失败