1、C語言的標準庫函數
C語言標準庫函數中包括很多函數,像string.h, stdio.h這些大家使用的最多,比如strcpy, printf, sprintf這些函數都是這些庫函數提供的。C語言標準庫函數一共包括以下文件。
1.1 assert.h 文件
assert.h庫函數提供了一個稱爲assert的宏,該宏可用於驗證程序所作的假設並在此假設爲假時打印診斷消息。定義的宏斷言引用另一個宏NDEBUG,它不是<assert.h>的一部分。如果將NDEBUG定義爲源文件中的宏名稱,則在包含<assert.h>的點處,assert宏的定義如下#define assert(ignore) ((void)0)
1.2 ctype.h 文件
C標準庫的ctype.h頭文件聲明瞭一些對測試和映射字符有用的函數。所有函數均接受int作爲參數,其值必須爲EOF或可表示爲無符號字符。如果參數c滿足所描述的條件,則所有函數均返回非零(true),否則返回零(false)。
1.3 errno.h 文件
C標準庫的errno.h頭文件定義了int變量errno,該整數變量由系統調用和某些庫函數在發生錯誤的情況下設置,以指示出問題所在。該宏擴展爲int類型的可修改左值,因此可以被程序讀取和修改。程序啓動時將errno設置爲零。標準C庫的某些函數會將其值修改爲非零值,以表示某些類型的錯誤。您還可以方便地修改其值或將其重置爲零。errno.h頭文件中還定義指示不同的錯誤代碼,這將擴大到與類型整數常量表達式宏的列表。
1.4 float.h 文件
C標準庫的float.h頭文件包含一組與浮點值相關的各種平臺相關的常數。這些常量由ANSI C提出。它們允許製作更多可移植的程序。在檢查所有常量之前,最好了解浮點數由以下四個元素組成。
1.5 limits.h文件
limits.h中報頭確定的各種變量類型的各種屬性。此標頭中定義的宏限制了各種變量類型(例如char,int和long)的值。這些限制指定變量不能存儲超出這些限制的任何值,例如,unsigned char最多可以存儲255。
1.6 locale.h 文件
locale.h定義了位置特定的設置,如日期格式和貨幣符號。您將找到幾個定義的宏,以及一個重要的結構struct lconv和下面列出的兩個重要函數。
1.7 math.h 文件
math.h定義了各種數學函數和一個宏。該庫中所有可用的函數都將double作爲參數,並返回double作爲結果。
1.8 setjmp.h 文件
setjmp.h定義了宏setjmp()、一個函數longjmp()和一個變量類型jmp_buf,用於繞過正常的函數調用和返回規則。
1.9 signal.h 文件
signal.h定義的變量類型sig_atomic_t,兩個函數調用,和多個宏處理程序的執行過程中報告不同的信號。
1.10 stdarg.h 文件
stdarg.h定義的變量類型va_list的並且可以被用於獲取在參數時的參數的數目是不知道的參數即變量數的函數三個宏。變量參數的函數在參數列表的末尾用省略號(,...)定義。
1.11 stddef.h 文件
stddef.h定義了各種變量類型和宏。其中許多定義也出現在其他頭文件中。
1.12 stdio.h 文件
stdio.h定義了三個變量類型,若干宏,和用於執行輸入和輸出的各種函數。
1.13 stdlib.h 文件
stdlib.h定義了四個變量類型,若干宏,和各種函數。
1.14 string.h 文件
string.h定義了一個變量類型,一個宏,以及用於操縱字符數組的各種函數。
1.15 time.h 文件
time.h定義了四個變量類型,兩個宏信息和各種函數用於操縱日期和時間。這個文件就是本博文介紹的重點。
以上的庫函數的文件的介紹引用自https://www.jc2182.com/c/c-time.html
2 time.h文件中的時間相關函數
time.h中的時間的函數比較多,並且好幾個函數都是做不同的格式的時間的轉換,如果不對整個函數有一個整體的認識,初次學習很難掌握這些時間相關函數的功能。爲了方便了解清楚time.h中相關的函數的功能,今天特別畫了一張圖的來說明這些函數之間的相關關係,咱們今天是圖說time.h。首先要了解關於時間的幾個名詞,概念。
GMT 的全名是格林威治標準時間或格林威治平時 (Greenwich Mean Time),這個時間系統的概念在 1884 年確立,由英國倫敦的格林威治皇家天文臺計算並維護,並在往後的幾十年往歐陸其他國家擴散。在 1924 年開始,格林威治天文臺每小時就會向全世界播報時間。
在剛開始的幾十年,GMT 的測量方法非常簡單:觀測者隨時監控太陽在天空的位置,並且把每天太陽爬升到仰角最高的時候記錄下來,這個時間點稱呼爲“過中天”。一般人對於一天 24 小時的理解,大致上就相等於兩次太陽過中天的時間間隔。不過由於地球是以橢圓軌道繞着太陽,在軌道上的行進速率不一,導致一年之中會有“比較長的一天”與“比較短的一天”,所以格林威治的觀測者必須要至少連續觀測一年,然後求取 365 個長度不一的“天”,再把他們全部平均後,得到固定的一天長度,之後再細分成時、分、秒等單位。這個就是 GMT。
GMT 12:00 就是指的是英國倫敦郊區的皇家格林尼治天文臺當地的中午12:00,而GMT+8 12:00,則是指的東八區的北京當地時間的12:00
UTC協調世界時,又稱世界統一時間、世界標準時間、國際協調時間。協調世界時,即以我爲基準,向我看齊的意思。(英語:Coordinated Universal Time,法語:Temps Universel Coordonné,簡稱UTC)是最主要的世界時間標準,由於英文(CUT)和法文(TUC)的縮寫不同,作爲妥協,簡稱UTC。UTC + 時區差 = 本地時間。
夏時制,另譯夏令時間(英語:Summer time),又稱日光節約時制、日光節約時間(英語:Daylight saving time),是一種爲節約能源而人爲規定地方時間的制度,在這一制度實行期間所採用的統一時間稱爲“夏令時間”。一般在天亮較早的夏季人爲將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。
比如,小惠所在的地方冬天時太陽七點鐘升起,她每天早上七點鐘起牀,一天在書房學習十二個小時,晚上七點睡覺。而到了夏天太陽變成六點升起,現在六點鐘天就亮了,如果此時小惠還是七點鐘起牀的話,相當於‘浪費’了一個小時的光照時間。而如果將鬧鐘上的時間撥快一個小時(太陽提前一個小時就升起了),那麼同樣七點起牀(鬧鐘上顯示的是七點而實際上是六點),學習十二個小時,到了晚上六點鐘上牀睡覺(節約了六點到七點的用電時間)。所以使用夏令時的地區,就相當於倡導大家早睡早起,使居民能夠儘可能的享受自然陽關,從而達到節約家庭用電的目的。
2.1 真正的圖說time.h
這張圖是真正的一圖說清楚time.h中相關的函數的功能,你一定要認真的多看幾次,首先圖1三種時間格式的變換圖,變換圖最低層的時間是“日曆時間”即從1970年1月1日0:0:0開始到現在時間的時間秒數,也叫做時間戳。一般時間戳指UTC時間戳。中間層的時間是“分解時間”,即是用一個結構體來表示時間,結構體的成員中包括年,月,日,時,分,秒,星期,一年中的總天數等。最頂層的時間,“字符串時間”,是我根據這個圖的上下時間格式轉換而命名的一個字符串時間,實際就是把分解時間結構體的年,月,日,時,分,秒打印到一個字符串中去,格式化時間。time.h文件中提供的函數就是實現了這三種時間的相互轉換,注意時間轉換成分解時間時是與時區相關的。
2.2 不同編譯器的差別
上圖中時間相關函數的功能介紹引用自keil編譯器中的time.h文件,其他編譯器的中相關函數的定義總體一樣,細節上可能有區別,請自行查看相關編譯器下的time.h文件。keil編譯器中time.h函數中沒有時區相關功能的配置函數,即keil中所有的時間轉換都是指的是UTC時間或GMT時間,應用程序自行定義時區來計算本地時間。
IAR編譯器和GCC編譯器提供了相關的時區設置函數,比如把時區設置爲北京時區,可以調用函數setenv("TZ", "GMT-8", 1); 和函數tzset()。