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<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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章