時間類型定義:
標頭檔:time.h
定義為:time_t 某些系統定義為 typedef long time_t
擷取時間函數:time_t time(time_t * timer);
time_t time_now;
time(&time_now);
輸出時間函數:char *ctime(const time_t *time);
printf(“%s”,ctime(&time_now));
轉化時間函數:struct tm *localtime(const time_t *clock);
struct tm *tmp = localtime(&time_now);
tmp->tm_mon 表示月份
tmp->tm_day 表示年
struct tm的裡面的元素是秒,分,時,日,月,年,夏令時標誌。
反轉函數:time_t mktime(strcut tm * timeptr);
改函數使用需要謹慎,因為有可能遇到各種各樣的日期格式!
計算時間差值:double difftime(time_t time2, time_t time1);
返回time2-time1的值,傳回值是double型!
注1:
擷取時間之後,使用locatime函數進行轉換,輸出的日期需要月份加1,年份加1900。因為所求出的秒數是從1970.1.1 00:00:00 至今擷取的。
如下面的程式:
#include <time.h><br />#include <stdio.h><br />#include <stdlib.h></p><p>int main(int argc,char *argv[])<br />{<br /> time_t now;<br /> struct tm *tm1;<br /> time(&now); //擷取目前時間(本地時間)<br /> tm1 = localtime(&now); //轉換成struct tm*<br /> printf(“%4d-%d-%2d/n”,tm1->tm_year+1900,tm1->tm_mon+1,tm1->tm_mday); //輸出年月日<br /> return 0;<br />}<br />
注2:
以上的時間都是取的本地時間,而本地時間和UTC是有區別的,也就是格林威治時間。
若想擷取格林威治時間,使用函數gmtime();
struct tm *gmtime(const time_t *tp); //將本地時間轉換為格林威治時間。
注3:
在一些系統中,time_t被定義為:typedef long time_t,如果這樣的話,最大的時間是什麼時候?下面程式實現之:
time_t max_time = 0x7FFFFFFF; //這裡為什麼不是FFFFFFFF?因為必須定義為無符號數;<br /> printf(“%s”,ctime(&max_time)); //輸出時間
輸出結果為:
Tue Jan 19 11:14:07 2038
這說明,到了這個時刻,時間計數將從0開始,系統就是面臨著重大的bug。如何解決這個問題,以下是個人猜想:定義時間為 typedef long long time_t;
這樣,儲存的秒數則為231,除以一年的秒數(365*24*60*60),應該是夠用的了!
而像是定義為 long long 型,該怎麼儲存計算呢?
如果是64位的系統,則電腦一次定址可以是64位,也就是完全可以勝任;
如果是32位的系統,應該定義成數組,類似的a[2]來實現之。
注4:
在使用夏令時轉換的時候,一天並不是24小時,所以使用86400秒/天時需要注意。
注5:
其它的時間函數,這裡就不詳細講了。
clock_t clock(void);
char *asctime(const struct tm *tp);
size_t strftime(char *s,size_t smax,const char *fmt,congst struct tm *tp);
儒略日數方案(Jnlian day numbers);