- 由於自己實際工作學習中沒怎麼用時間和日期的函式,在看Unix環境高階程式設計6.10節和Python的time模組時,總感覺這些東西總是連不成串。
還是從C開始理一理吧。翻翻C標準(C 中的東西我看不懂),相關的也就是time.h這個東西了。
巨集 | NULL CLOCKS_PER_SEC |
型別 | size_t clock_t time_t |
結構體 | tm |
函式 | asctime clock difftime localtime strftime |
走馬觀花
暫時拋開和clock相關的東西。只看字面上和time直接相關的東西。
獲取時間
如何從作業系統獲取時間呢?
time_t time(time_t *t);
該函式返回從某個時間點(epoch)到現在為止所經過的秒數。(這個數稱為日曆時間) 比如:
1319206097
- (一般情況下這個時間點都是公元1970年1月1日0時,但是微軟的C/C 編譯器版本7中用的卻是1899年12月31日0時,注意,編譯器的版本不是MVSC的版本,比如MSVC2010也叫VC9,但對應的編譯器版本是16)
這個數字對人來說可真不友好。比如上面這個對應的具體日期是什麼,如果不是我寫的我還真不知道
轉成字串
char *ctime(const time_t *timep);
我們知道,同一時刻各個時區的時間是不同的。這個函式會考慮當前的時區(通過環境變數TZ)
Fri Oct 21 22:08:17 2011\n\0
這下好看多了,但還是很不夠…
分解時間,結構體 tm
我們可以將日曆時間,轉成包含時分秒等資訊的結構體。這樣處理起來就方面多了。
struct tm *gmtime(const time_t *timep); struct tm *localtime(const time_t *timep);
- 注意:返回的tm結構體的指標,指向的是其內部的一個靜態tm結構體變數。
gmtime | localtime | |
17 | 17 | 秒 |
8 | 8 | 分 |
14 | 22 | 時 |
21 | 21 | 21日 |
9 | 9 | 10月(從0開始算) |
111 | 111 | 2011年(從1900開始) |
5 | 5 | 週五 |
293 | 293 | 一年中的第293天 |
0 | 0 | 不是夏時制 |
要從分解時間轉換會日曆時間,則使用
time_t mktime(struct tm *tm);
轉成字串2
前面的ctime可以從日曆時間轉成字串,那麼從分解時間如何轉成字串呢?
char *asctime(const struct tm *tm);
比如:前面的gmtime和localtime得到的分解時間,分別對應
Fri Oct 21 14:24:34 2011 Fri Oct 21 22:24:34 2011
不過這個東西太死板了吧,想自定義字串怎麼辦?
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
和printf類似,有一大堆轉換符可用,這樣一來,我們可以得到
Fri Friday 2011-10-21 10:24:34 PM ...
型別
簡單羅列一下:
time_t
一個整數型別,但具體的範圍和精度是由編譯器實現所定義的。
struct tm
結構體tm 表示 分解時間(broken-down time)
struct tm { | |
int tm_sec; | |
int tm_min; | /* 分鐘: [0 – 59] */ |
int tm_hour; | /* 小時: [0 – 23] */ |
int tm_mday; | /* 日: [1 – 31] */ |
int tm_mon; | /* 月: [0 – 11] */ |
int tm_year; | /* 年: 從1900年開始算起 */ |
int tm_wday; | /* 星期X: [0 – 6] */ |
int tm_yday; | /* 一年中第X天: [0 – 365] */ |
int tm_isdst; | /* 夏時制標記: <0, 0, >0 */ |
}; |
夏時值,即:日光節約時制(Daylight Saving Time)
clock_t
clock_t clock(void);
返回程式自開始執行到目前為止所佔用的處理機時間。如果處理機時間不可使用,那麼返回-1。clock()/CLOCKS_PER_SEC是以秒為單位表示的時間。
其他
Unix
在Unix下,與time()相比,
int gettimeofday(struct timeval *tv, struct timezone *tz);
可以獲得更高的解析度(最高為微秒)。
QThread::sleep()在unix下的實現使用該函式。
python的time模組中的time()/sleep()也使用該函式。
locale
函式strftime()生成的字串受locale中的LC_TIME影響
写评论
很抱歉,必須登入網站才能發佈留言。