在手冊上有 time ctime gmtime localtime asctime mktime settimeofday,gettimeofday等時間函數
還有UTC和本機時間和這些函數的區別.瞭解這些 是linux時間編程必須得!
首先說基本的結構體和typedef 以及define:
time_t <time.h>
#ifndef __TIME_T
#define __TIME_T /* 避免重複定義 time_t */
typedef long time_t; /* 時間值time_t 為長整型的別名*/
#endif
使用方法是 time(&time_tvar);這樣time函數會返回 且 給這個地址的time_t類型的變數賦值為一個單位為秒的值(從1970-1-1 0:0:0到現在這一秒的數目,其最大是32位(4294967296),但是沒有unsigned只好一半;2011.12.22大約是1324544508,距離其飽滿大約還有幾十年,即使是unsigned,從1970年開始 只有132.95年,到2103年(4194288000),這個數值將溢出..汗,下次再設計的時候 希望不要再考慮 幾個位元組.應該盡量的大...)
對於從1970年到現在的秒,我自己也寫了一個演算法:
int getDaysSinceYear(){//0-365 not including this year!
time_t t;time(&t);
struct tm *p;
p=localtime(&t);
return p->tm_yday;
}
int getDaysSinceYear2(int year,int mon,int day){//這個是另外一個演算法,範圍1-366.所以應該-1 來達到上面的目的
int myyday=0;
mon--;//last Month and before
while(mon>0){//from 1 to last month!!!!!!!!!!
switch(mon){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:myyday+=31;break;
case 4:
case 6:
case 9:
case 11:myyday+=30;break;
case 2:myyday+=28;break;
default:break;
}
mon--;
}
myyday+=day;//And Plus this month's days
if(year%4==0)myyday+=1;// 2 yue if it is 29 days!!!
return myyday;
}
int getSecondsByTime(int year,int month,int days,int hour,int minute,int second){
//input format : 2011 11 11 11 11 11
printf("%d-%d-%d %d:%d:%d == input time\n",year,month,days,hour,minute,second);
int daySeconds=24*60*60;
seconds=hour*60*60+minute*60+second;//this year!
seconds+=(getDaysSinceYear())*daySeconds;
year--;//so not including this year!
for(;year>=1970;year--){//1970 - last year!
seconds+=365*daySeconds;
if(year%4==0)seconds+=daySeconds;
}
seconds-=8*60*60;//UTC Time .Current +8 hours beijing!
printf("%d == seconds(1970) in UTC\n",seconds);
return seconds;
}
最後獲得的秒我有一個操作 :seconds-=8*60*60;為什麼這麼做?因為 我的電腦設定顯示本地時間(即不是UTC時間)
如果按照UTC時間那需要+8個小時的.(windows上也預設是local時間,不是UTC的,所以經常出現倆時間不同步的問題,只要取消linux的UTC就可以了,在/etc/rc.conf類似的檔案中設定我的是archlinux)
這個時間是從BIOS擷取的,作業系統要處理這個時間,如果以UTC時間來處理,那麼把BIOS時間當 UTC+0的時間,我們設定了UTC的timezone地區是 北京 UTC+8,所以linux此時就會把系統時間+8個小時就逾時了...(後來我改成local時間,重啟系統,時間恢複,比之前-8小時,一些檔案的時間就慘了..提示 比現在靠後8小時...),所以time()是UTC+0的時間,如果系統設定UTC timezone為+0 我想就沒著問題了吧...汗啊..誰叫我們的時間比他們UTC+0時區要早8個小時呢.
即使改成系統時間為BIOS本地時間,在編程他還是獲得的是UTC時間,我們如果要獲得當前的時間,需要-8小時.太噁心了.
從時間變成秒,linux沒有直接的函數.但是從秒變成 時間的結構體就有了!!gmtime(&time_tVar)和localtime(&time_tVar);
這倆的區別就是 UTC,又是它 噁心啊...秒是目前時間的秒,UTC+0,使用gmtime獲得UTC+0的時間,localtime獲得本地時間UTC+8,localtime是正確的.
現在時間就是下面的這個...還是說明 t 是UTC+0的時間.
總之這個時間編程中UTC是比較煩人的..還有一個問題是: Java 中可以獲得微妙,秒後 有1000*1000的進位,如果用C來把Java的時間轉換成現即時間呢???