LINUX 時間和日期

來源:互聯網
上載者:User

時間和日期

通常能確定時間和日期對一個程式來說是非常有用的。程式可能希望記錄它啟動並執行時間,或者可能需要在某些時候改變它的運行方式。例如,一個遊戲可能拒絕在工作時間運行,或者一個定時備份程式可能想等到每天的淩晨才開始一個自動備份。所有的UNIX系統都使用同一個時間和日期的
起點:格林尼治時間(GMT)1970年1月1日午夜(0點)。這是“UNIX紀元的起點”,Linux也不例外。Linux系統中所有的時間都以從那時
起經過的秒數來衡量。這和MS-DOS處理時間的方法類似,只是MS-DOS紀元始於1980年。其他系統使用其他的紀元起始時間。時間通過一個預定義的類型time_t來處理。這是一個大到能夠容納以秒計算的日期和時間的整數類型。在Linux系統中,它是一個長整型,與處理時間值的函數一起定義在標頭檔time.h中。絕不要想當然地以為,時間就是32位的。在使用32位time_t類型的UNIX和Linux系統中,時間將在2038年迴繞。那時,我們希望系統都開始使用大於32位的time_t類型。你可以通過調用time函數得到底層的時間值,它返回的是從紀元開始至今的秒數。如果tloc不是一個null 指標,time函數還會把傳回值寫入tloc指標指向的位置。實驗:time函數下面這個簡單的程式envtime.c示範了time函數的用法:運行這個程式,它會在20秒時間內每兩秒鐘列印一次底層的時間值。實驗解析這個程式用一個null 指標參數調用time函數,返回以秒數計算的時間和日期。程式休眠兩秒後再重複調用time函數,總共調用10次。以從1970年開始計算的秒數來表示時間和日期,對測算某些事情持續的時間是很有用
的。我們可以把它考慮為只是簡單地把兩次調用time得到的值相減就行了。然而ISO/ANSI
C標準委員會經過深思熟慮,並沒有規定用time_t類型來測量任意時間之間的秒數,他們發明了一個函數difftime,該函數用來計算兩個
time_t值之間的秒數並以double類型返回它。difftimeFunction Compute兩個時間值之間的差,並將time1-time2的值作為浮點數返回。對Linux來說,time函數的傳回值是秒數,可以對它進行處理,但考慮到最大限度的增加可移植性,則最好使用difftime。為了提供(對人類)更有意義的時間和日期,我們需要把時間值轉換為可讀的時間和日期。有一些標準函數可以幫我們做到這一點。gmtime函數把底層時間值分解為一個結構,該結構包含一些常用的欄位。tm結構定義為至少包含表4-2所示的成員。表  4-2
tm成員 說    明
int tm_sec 秒,0~61
(續)
tm成員 說    明
int tm_min 分,0~59
int tm_hour 小時,0~23
int tm_mday 月份中的日期,1~31
int tm_mon 月份,0~11(一月份為0)
int tm_year 從1900年開始計算的年份
int tm_wday 星期幾,0~6(周日為0)
int tm_yday 年份中的日期,0~365
int tm_isdst 是否夏令時
tm_sec的範圍允許臨時閏秒或雙閏秒。實驗:gmtime函數下面這個程式gmtime.c利用tm結構和gmtime函數列印出目前時間和日期:運行這個程式,我們得到含義明顯的時間和日期:實驗解析程式調用time函數得到底層的時間值,然後調用gmtime將該值轉換為一個包含更
有用的時間和日期值的結構。程式用printf將這些資訊列印出來。嚴格來說,不應該用這種方法列印原始時間值,因為我們並不能保證它在所有系統上都是
long類型的值。我們在gmtime程式後立即運行date命令,以比較它們的輸出。不過,這兒有個小問題。如果你在格林尼治標準時間(GMT)之外的時區運行這個程式,
或者如果你所在的地方採用了夏令時,你會發現時間(可能還有日期)是不對的。因為gmtime按GMT返回時間(現在GMT被稱為世界標準時間,或
UTC)。Linux和UNIX這樣做是為了同步全球各地的所有程式和系統。不同時區同一時刻建立的檔案就會有相同的建立時間。要看當地時間,我們需要使
用localtime函數。localtime函數和gmtime一樣,除了它返回的結構中包含的值已根據當地時區和是否採用夏令時做了調整。如果你把上面程式中gmtime換成localtime再編譯運行一次,你就會看到正確的時間和日期了。要把已分解出來的tm結構再轉換為原始的time_t時間值,可以使用mktime函數:如果tm結構不能表示為time_t值,mktime將返回-1。為了得到更“友好”的時間和日期表示,像date命令輸出的那樣,我們可以使用asctime函數和ctime函數:asctime函數返回一個字串,表示由tm結構timeptr所給出的時間和日期。這個返回的字串有類似下面的格式:它總是這種長度為26個字元的固定格式。ctime函數等效於調用它以原始時間值為參數,並將它轉換為可讀的本地時間。實驗:ctime函數我們用下面的代碼來看看ctime函數的用法。編譯並運行這個ctime.c程式,輸出如下:實驗解析ctime.c程式調用time函數得到底層時間值,讓ctime做所有的艱巨工作,把時間值轉換成可讀的字串,然後列印它。為了對時間和日期文字的格式有更多控制,Linux和現代的類UNIX系統提供了strftime函數。它很像是一個針對時間和日期的sprintf函數,工作方式也很類似:strftime函數格式化timeptr指標指向的tm結構所表示的時間和日期,並
將結果放在字串s中。字串被指定(至少)maxsize個字元。format字串用於控制寫入字串s的字元。與printf一樣,它包含將被傳給
字串的一般字元和用于格式化時間和日期元素的轉換控制符。轉換控制符見表4-3。表  4-3
轉換控制符 說    明 轉換控制符 說    明
%a 星期幾的縮寫 %S 秒,00~61
%A 星期幾的全稱 %u 星期幾,1~7(周一為1)
%b 月份的縮寫 %U 一年中的第幾周,01~53(周日是一周的第一天)
%B 月份的全稱 %V 一年中的第幾周,01~53(周一是一周的第一天)
%c 日期和時間 %w 星期幾,0~6(周日為0)
%d 月份中的日期,01~31 %x 本地格式的日期
%H 小時,00~23 %X 本地格式的時間
%I 12進位的小時,01~12 %y 年份減去1900
%j 年份中的日期,001~366 %Y 年份
%m 年份中的月份,01~12 %Z 時區名
%M 分鐘,00~59 %% 字元%
%p a.m.(上午)或p.m(下午)
因此,date命令輸出的普通日期就相當於strftime格式字串中的:為了協助讀取日期,我們可以使用strptime函數,該函數以一個代表日期和時間的字串為參數,並建立表示同一日期和時間的tm結構:format字串的構建方式和strftime的format字串完全一樣。
strptime在字串掃描方面類似於sscanf函數,也是尋找匹配資料欄位,並把它們寫入對應的變數中。只是這裡是根據format字串填充tm
結構的成員。不過,strptime的轉換控制符與strftime的相比,限制要稍微松一些,因為strptime中的星期幾和月份用縮寫和全稱都行,
兩者都匹配strptime中的%a控制符,此外,strftime使用小於10的數字總以0開頭,而strptime則把它看作是可選的。strptime返回一個指標,指向轉換過程處理的最後一個字元後面的那個字元。如果碰到不能轉換的字元,轉換過程就在該點停下來。調用程式需要檢查是否已從傳遞的字串中讀入了足夠多的內容,以確保tm結構中寫入了有意義的值。實驗:strftime函數和strptime函數請留意下面這個程式中選用的轉換控制符:編譯並運行這個程式strftime.c,我們得到:實驗解析strftime程式通過調用time和localtime得到當前的本地時間。然
後,它通過調用帶有合適的格式參數的strftime將時間轉換成可讀的格式。為示範strptime的用法,程式構建了一個包含日期和時間的字串,然
後調用strptime將原始時間和日期值分解並列印出來。轉換控制符%R是strptime中對%H:%M的縮寫形式。注意:要成功地掃描日期,strptime需要一個精確的格式字串。這一點非常重要。一般來說,該函數不會精確掃描讀自使用者的日期,除非使用者輸入的格式非常嚴格。編譯strftime.c時,你可能會看到編譯器有一個警告資訊。因為GNU庫在預設情況下並未聲明strptime函數。要解決這個問題,在包含time.h標頭檔的語句之前加上如下一行即可,它的作用是明確請求使用X/Open標準的功能:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.