時間操做函式
2008年9月8日 星期一 by Anati
也許對於time.h裡面所有的函式你都已經很熟了,但是函式的應用方面其實可以做很多的事情,而且在time函式裡面有一些陷井存在,所以適當的了解和應用,對於以後程式之中需要用到時間函式方面的問題才容易解決。
※ 函式庫的介紹
如果要使用時間相關的函式的話,一定會加入time.h這個標頭檔的,因為它定義了系統提供給我們的一些函式介面,但是裡面出現了幾個資料型別,和幾個給我們用的函式介面。
Data Type:
* time_t 其實是unsigned long的型別,用來存時間數的
* struct tm 日期結構,可以時間數轉換而來
{
int tm_sec; 秒 0-59
int tm_min; 分 0-59
int tm_hour; 時 0-23
int tm_mday; 日期 1-31
int tm_mon; 月0-11
int tm_year; 年(從1900起算)
int tm_wday; 星期 (0-6)
int tm_yday;
int tm_isdst;
}
Function Interface
* time_t time(time_t* t) 產生時間數,t若為0則產生目前系統的時間數
* time_t mktime(struct tm* stm) 將日期結構轉換為時間數
* char* ctime(const time_t* t) 直接將時間數輸出成為文字表示
* char* asctime(const struct tm* stm) 將日期結構輸出成為文字表示
* struct tm* localtime(const time_t* t) 將時間數轉換為日期結構(static return)
* struct tm* gmtime(const time_t* t) 將國際標準時間數轉換為日期結構(static return)
* double difftime(time_t t2, time_t t1) 兩時間數的差異時間
了解時間的型別之後,覺得上面函式沒有什麼,只不過是轉來轉去而且「時間數」和「日期結構」有什麼差別呢?時間數可以拿來計算,但是日期結構不行,所以如果我們要計算某天和某天的差了幾天,我們必須要先建立兩個日期結構,之後轉換成時間數,再來將兩時間數比對,如此就可以算出差異時間了。
上面有提到static return 是什麼呢?其實使用localtime, gmtime的時候,其實系統會產生一塊空間,來放這個結構,之後回傳指向這個結構的指標,因此你必須要記錄下來,不過這樣發生了一個問題,如果你先呼叫 localtime和gmtime那本來的localtime系統產生的那一塊空間,就會被蓋掉,也就是說你的指標會很神奇的自動變成指向gmtime所產生出來的時間如。
Example:
time_t t1;
t1 = time(0);
struct tm* ptm;
ptm = localtime(&t1);
gmtime(&t1);
printf("%s", asctime(ptm));
好神奇,怎麼輸出的是gmtime阿,因為gmtime和localtime共用同一個空間,所以系統產生出來存放的空間你雖然可以拿來用,但是如果你要保有你之前所產生出來的資料的話,就必須自己要存好。
Example:
time_t t1;
t1 = time(0);
struct tm stm1, stm2;
struct tm* tmp_ptm = localtime(&t1);
stm1 = *tmp_ptm;
tmp_ptm = gmtime(&t1);
stm2 = *tmp_ptm;
printf("%s", actime(&stm1));
printf("%s", actime(&stm2));
如此這樣就可以分別保有你產生出來的時間了,而系統產生出來的空間你不用去刪除,因為它和程式共存亡,程式結束空間就釋放掉了。
※ 計時
Example:
time_t t1, t2;
t1 = time(0);
while (1)
{
if (getchar() == 'q')
{
break;
}
}
t2 = time(0);
printf("%f", difftime(t2, t1));
如此我們就可以計算程式等待輸入,直到輸入為q的時間了。
※ 時間函式轉換
Example:
typedef struct tm Tm;
time_t t1, t2;
Tm stm = {0};
t1 = time(0);
printf("%ld\n", t1);
printf("%s", ctime(&t1));
Tm* tmp_ptr = localtime(&t1);
stm = *tmp_ptr;
printf("%s", asctime(&stm)); t2 = mktime(&stm);
printf("%ld\n", t2);
※ 產生日期
Example:
typedef struct tm Tm;
Tm stm2 = {0};
stm2.tm_sec = 0;
stm2.tm_min = 0;
stm2.tm_hour = 0;
stm2.tm_mday = 4;
stm2.tm_mon = 10-1;
stm2.tm_year = 2007-1900;
stm2.tm_wday = 4;
printf("%s", asctime(&stm2));
time_t t1 = mktime(&stm2);
※ 函式庫的介紹
如果要使用時間相關的函式的話,一定會加入time.h這個標頭檔的,因為它定義了系統提供給我們的一些函式介面,但是裡面出現了幾個資料型別,和幾個給我們用的函式介面。
Data Type:
* time_t 其實是unsigned long的型別,用來存時間數的
* struct tm 日期結構,可以時間數轉換而來
{
int tm_sec; 秒 0-59
int tm_min; 分 0-59
int tm_hour; 時 0-23
int tm_mday; 日期 1-31
int tm_mon; 月0-11
int tm_year; 年(從1900起算)
int tm_wday; 星期 (0-6)
int tm_yday;
int tm_isdst;
}
Function Interface
* time_t time(time_t* t) 產生時間數,t若為0則產生目前系統的時間數
* time_t mktime(struct tm* stm) 將日期結構轉換為時間數
* char* ctime(const time_t* t) 直接將時間數輸出成為文字表示
* char* asctime(const struct tm* stm) 將日期結構輸出成為文字表示
* struct tm* localtime(const time_t* t) 將時間數轉換為日期結構(static return)
* struct tm* gmtime(const time_t* t) 將國際標準時間數轉換為日期結構(static return)
* double difftime(time_t t2, time_t t1) 兩時間數的差異時間
了解時間的型別之後,覺得上面函式沒有什麼,只不過是轉來轉去而且「時間數」和「日期結構」有什麼差別呢?時間數可以拿來計算,但是日期結構不行,所以如果我們要計算某天和某天的差了幾天,我們必須要先建立兩個日期結構,之後轉換成時間數,再來將兩時間數比對,如此就可以算出差異時間了。
上面有提到static return 是什麼呢?其實使用localtime, gmtime的時候,其實系統會產生一塊空間,來放這個結構,之後回傳指向這個結構的指標,因此你必須要記錄下來,不過這樣發生了一個問題,如果你先呼叫 localtime和gmtime那本來的localtime系統產生的那一塊空間,就會被蓋掉,也就是說你的指標會很神奇的自動變成指向gmtime所產生出來的時間如。
Example:
time_t t1;
t1 = time(0);
struct tm* ptm;
ptm = localtime(&t1);
gmtime(&t1);
printf("%s", asctime(ptm));
好神奇,怎麼輸出的是gmtime阿,因為gmtime和localtime共用同一個空間,所以系統產生出來存放的空間你雖然可以拿來用,但是如果你要保有你之前所產生出來的資料的話,就必須自己要存好。
Example:
time_t t1;
t1 = time(0);
struct tm stm1, stm2;
struct tm* tmp_ptm = localtime(&t1);
stm1 = *tmp_ptm;
tmp_ptm = gmtime(&t1);
stm2 = *tmp_ptm;
printf("%s", actime(&stm1));
printf("%s", actime(&stm2));
如此這樣就可以分別保有你產生出來的時間了,而系統產生出來的空間你不用去刪除,因為它和程式共存亡,程式結束空間就釋放掉了。
※ 計時
Example:
time_t t1, t2;
t1 = time(0);
while (1)
{
if (getchar() == 'q')
{
break;
}
}
t2 = time(0);
printf("%f", difftime(t2, t1));
如此我們就可以計算程式等待輸入,直到輸入為q的時間了。
※ 時間函式轉換
Example:
typedef struct tm Tm;
time_t t1, t2;
Tm stm = {0};
t1 = time(0);
printf("%ld\n", t1);
printf("%s", ctime(&t1));
Tm* tmp_ptr = localtime(&t1);
stm = *tmp_ptr;
printf("%s", asctime(&stm)); t2 = mktime(&stm);
printf("%ld\n", t2);
※ 產生日期
Example:
typedef struct tm Tm;
Tm stm2 = {0};
stm2.tm_sec = 0;
stm2.tm_min = 0;
stm2.tm_hour = 0;
stm2.tm_mday = 4;
stm2.tm_mon = 10-1;
stm2.tm_year = 2007-1900;
stm2.tm_wday = 4;
printf("%s", asctime(&stm2));
time_t t1 = mktime(&stm2);