NO IMAGE
  • 由於自己實際工作學習中沒怎麼用時間和日期的函式,在看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
ctime gmtime mktime time

走馬觀花

暫時拋開和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
本地時間(東8區)

 

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