2008年12月4日 星期四

C/C++:時間相關函數及用法

常用到的時間相關函數有:
  • time_t time(time_t *t);
  • struct tm *gmtime(const time_t *timep);
  • struct tm *localtime(const time_t *timep);
  • char *asctime(const struct tm *tm);
  • char* ctime(const time_t* timer);
  • clock_t clock(void);
  • double difftime(time_t timer2, time_t timer1);
  • time_t mktime ( struct tm * timeptr );

說明:

time_t time(time_t *t);
time(). 它會傳回自 00:00:00 01/01/1970 到現在所經過的秒數。在 x86 上 time_t 是一個 32bit 的整數 (signed long int). time() 若傳回 -1 表示錯誤。

取得time()回傳的秒數之後可以使用 gmtime() 和 localtime() 做轉換成一個將年月日時分秒等資訊分開的結構。

struct tm *gmtime(const time_t *timep);
將time_t的值傳入,回傳一個struct tm的結構,結構的時間是UTC時間。

struct tm *localtime(const time_t *timep);
將time_t的值傳入,回傳一個struct tm的結構,結構的時間是local時間。

struct tm結構如下:
struct tm {
int tm_sec; //seconds
int tm_min; //minutes
int tm_hour; // hours
int tm_mday; // day of the month
int tm_mon; // month
int tm_year; // year
int tm_wday; // day of the week
int tm_yday; // day in the year
int tm_isdst; // daylight saving time
};

如果想用現有的 function 印出日期字串, 可以使用 asctime()或ctime()。

char *asctime(const struct tm *tm);
char* ctime(const time_t* timer);

asctime() 會讀出 struct tm 中年月日等資訊並做成一個字串傳回. 若有錯誤則傳回 NULL。格式為"Www Mmm dd hh:mm:ss yyyy". 其中 Www 是星期,Mmm 是月份,dd是日期,hh:mm:ss 是時間,yyyy 是年份。ctime()跟asctime()輸出格式一樣。

clock_t clock(void);
clock()回傳從process開始執行到現在的clock數。

double difftime(time_t timer2, time_t timer1);
difftime()傳入兩個型態為time_t的參數,輸出兩個參數的相差值。

time_t mktime ( struct tm * timeptr );
傳數struct tm結構,根據傳入的結構內容,自動調整成正確的星期。


範例程式:

#include <stdio.h>
#include <time.h>
int main(void)
{
struct tm *T;
time_t t;
time(&t);
T = localtime(&t);
char *week[8]={"日","一","二","三","四","五","六"};
printf("現在時間:%d年 %d月 %d日 %d點 %d分 %d秒 星期%s\n",
T->tm_year+1900,T->tm_mon+1,T->tm_mday,T->tm_hour,T->tm_min,T->tm_sec,week[T->tm_wday]);
time(&t);
T = gmtime(&t);
printf("格林威治時間:%d年 %d月 %d日 %d點 %d分 %d秒 星期%s\n",
T->tm_year+1900,T->tm_mon+1,T->tm_mday,T->tm_hour,T->tm_min,T->tm_sec,week[T->tm_wday]);
return 0;
}



輸出結果:
現在時間:2008年2月17日2點12分35秒 星期日
格林威治時間:2008年2月17日18分35秒 星期日

沒有留言:

張貼留言