C語言零碎記錄之Linux下C語言關於時間的函數

來源:互聯網
上載者:User

在手冊上有 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的時間轉換成現即時間呢???

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.