目錄
- 關於時間的函式及tm結構體描述
- 對函式的簡單理解操作
- 函式功能實現
關於時間的函式及tm結構體描述
- time.h標頭檔案中常用的幾個函式描述如下:
序號 | 函式&描述 |
---|---|
1 | time_t time(time_t *tloc) 最基礎的函式,計算當前時間,並返回成 time_t(aka long int)格式 而且返回值是從Epoch(1970年1月1日)算起的秒數(second),可另起變數接受返回值,也可用tloc指標接收。 |
2 | char *asctime(const struct tm *tm) 傳入tm結構體引數,返回一個指向字串的指標,它代表了結構體tm能代表的日期和時間。 |
3 | char *ctime(const time_t *timep) 傳入tmep指標引數,返回一個表示當地時間的字串,當地時間是基於引數 timep。 與asctime的功能類似,區別僅為接收的引數不同,一個是結構體tm,一個是時間戳。 |
4 | struct tm *gmtime(const time_t *timep) timep 的值被分解為 tm 結構體,並用協調世界時(UTC)(也被稱為格林尼治標準時間(GMT))表示 與localtime函式的區別在於,gmtime不考慮時區的因素,始終返回UTC時間。 |
5 | struct tm *localtime(const time_t *timep) timep 的值被分解為 tm 結構,並用本地時區表示 |
6 | double difftime(time_t time1, time_t time2) 返回 time1 和 time2 兩個時間戳之間相差的秒數 (time1-time2)。 |
7 | time t mktime(struct tm *tm) 把 tm 所指向的結構轉換為一個依據本地時區的 timet值,功能與ctime相反。而且已經考慮了閏年等複雜計算問題 |
- 此外,還需要了解一個重要的概念,即struct tm *tm,函式原型如下:
struct tm
{
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
...
};
由tm函式原型的註釋得出,在引用tm結構體中月份和年份的時候,需要做簡單的算術運算:
/*
星期: stdTime->tm_wday
月份:stdTime->tm_mon + 1 日期:stdTime->tm_mday
時刻:stdTime->tm_hour stdTime->tm_min stdTime->tm_sec
年份:stdTime->tm_year + 1900
*/
對函式的簡單理解操作
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
time_t t = 0;
time_t curTime = time(NULL); // 從1970.1.1開始到現在的秒數
time(&t);//嘗試利用time的引數接收返回值
printf("curTime=%ld \nt=%ld\n", curTime, t);//進行結果對比
struct tm *stdTime = localtime(&curTime);
printf("curTime=%s \n", ctime(&curTime)); // 使用ocaltime 函式與ctime函式進行對比
printf("Wkday:%d\nMonth:%d %d\nTime:%d %d %d\nYear:%d\n", stdTime->tm_wday, stdTime->tm_mon + 1, stdTime->tm_mday, stdTime->tm_hour, stdTime->tm_min, stdTime->tm_sec, stdTime->tm_year + 1900);
return 0;
}
函式功能實現
/**
* @brief 利用時間函式,每2秒在log.txt檔案中輸入最新時間,並覆蓋原來的時間
* @date 2024/05/08
* CopyRight (c) 2023-2024 ni456xinmie@163.com All Right Reseverd
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (2 != argc) // 判斷函式呼叫時的引數是否輸入正確
{
printf("Usage:%s<dst>\n", argv[0]);
exit(1);
}
FILE *fp = NULL; // 申請結構體指標變數
struct tm *stdTime = NULL; // 申請tm結構體變數
time_t curTime = 0; // 申請時間戳變數
while (1)
{
/*
此處在迴圈體內進行開啟/關閉檔案並錯誤判斷,因為如果不進行這一步,則會無法開啟檔案看到時間覆蓋的動作。因此這一步需要根據具體裝置來調整。
*/
if (NULL == (fp = fopen(argv[1], "a")))//用a進行追加寫入,效果更明顯;不然可以直接用w進行覆蓋操作
{
perror("Open failed.\n");
exit(1);
}
curTime = time(NULL); // 獲取當前時間戳
stdTime = localtime(&curTime); // 使用localtime 函式,並獲取時間,傳入tm結構體
if ((fprintf(fp, "%d 年 %d 月 %d 日 星期%d %d時%d分%d秒\n", stdTime->tm_year + 1900, stdTime->tm_mon + 1, stdTime->tm_mday, stdTime->tm_wday, stdTime->tm_hour, stdTime->tm_min, stdTime->tm_sec) == EOF))
printf("Input time failed.\n"); // 對檔案進行輸入時間,並同時進行錯誤判斷
fclose(fp); // 迴圈體內進行關閉檔案操作,同第22行
sleep(2);
}
return 0;
}
執行後結果如下: