對於時間, C 闡述了這樣幾種概念:
1. Clock Tick: CPU時鐘計時單元
2. Calender Time: 日歷時間
3. Broken-down Time: 分解時間
4. Local Time: 本地時間
5. Coordinate Universal Time: 協調世界時
前面三種可以理解為元數據類型, 分別對應於: clock_t, time_t, tm.
而後面兩種只是前三種類型的地域性表示.
第一種, Clock Tick(CPU時鐘計時單元)
它是一種時間計量單位, 可以和秒進行換算.
clock_t clock_tick = clock(); // 表示程序運行以來到執行完該語句所耗費
的CPU時鐘計時單元個數
long seconds = clock_tick / CLOCKS_PER_SECOND; // 換算為秒
第二種, Calender Time(日歷時間)
它表示的是某一時間點距離原始時間點的秒數, 即它是以秒為單位的時間間隔.
而這個原始時間點, 不同的系統表示不同, 一般為1970年1月1日0時0分0秒, 而
在.Net2005中為1899年12月30日0時0分0秒.
// 表示當前時間點距離原始時間點的秒數
time_t calender_time = time(NULL);
// 輔助函數
// double difftime(time_t time2, time_t time1)
// 計算二者的秒數之差
第三種, Broken-down Time(分解時間)
它表示的是結構體, 成員包括年月\日時\分秒(其他省略).
// 先得到當前的日歷時間
time_t calender_time = time(NULL);
// 將日歷時間轉換為當前時區的分解時間
tm* local_time = localtime(&calender_time);
// 這裡提到了當前時區的分解時間, 即本地時間. 因為日期時間
// 因時區的不同而各異,
// 例如: 北京位於東八區.
// 格林威治時間是統一的世界時間, 即上面提到的協調世界時間
// 這裡將日歷時間轉換成格林威治式的分解時間
tm* utc_time = gmtime(&calender_time);
三種時間元類型給了我們很好的靈活性, 但也有值得注意的地方:
1. 可以直接獲取當前的日歷時間.
time_t calender_time = time(NULL);
2. 只能間接獲取當前的分解時間, 借助localtime()函數進行轉換
time_t calender_time = time(NULL);
tm* local_date = localtime(&calender_time);
3. 日歷時間可以轉化為日期的字符串表示
time_t calender_time;
// 賦值省略
char* szDate = ctime(calender_time);
4. 分解時間可以轉化為日期的字符串表示
tm* date;
// 賦值省略
char* szDate = asctime(date);
5. 分解時間可以直接轉換為日歷時間
tm date;
// 賦值省略
time_t time = mktime(&date);
6. 日歷時間可以轉換為分解時間
time_t time;
// 賦值省略
tm* date = localtime(&time);
7. 分解時間可以格式化輸出
// 借助strftime函數以及printf等函數