時間函式的簡單理解和應用(time.h)

Rice_rice發表於2024-05-09

目錄
  • 關於時間的函式及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;
}

執行後結果如下:

相關文章