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

  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 /* 需要的头文件 */
    
    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函数)