日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C/C++中時間庫函數的使用詳解_C 語言

作者:SakuraMay_Ai ? 更新時間: 2022-12-09 編程語言

C/C++ 中時間的概念

Unix 時間戳(Unix timestamp),或稱 Unix 時間(Unix time)、POSIX 時間(POSIX time),是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。time_t 就是用來存儲該數的一個類型,它是 unsigned long 類型。使用64位二進制數字表示時間的系統,最多可以使用到格林威治時間292,277,026,596年12月04日15時30分08秒。如果想要更精確一點,可以用結構 struct timeval,它可以精確到微秒:

struct timeval
{
    long tv_sec;    // 秒
    long tv_usec;     // 微秒
};

而直接存儲年月日時分秒等的是一個結構體:

struct tm
{
    int tm_sec;        // 秒,正常范圍0-59, 允許至61
    int tm_min;        // 分鐘,0-59
    int tm_hour;    // 小時, 0-23
    int tm_mday;    // 日,一個月中的第幾天,1-31
    int tm_mon;        // 月,從一月算起,0-11,1 + p->tm_mon;
    int tm_year;    // 年,從1900至今已經多少年,1900 + p->tm_year;
    int tm_wday;    // 星期,一周中的第幾天,從星期日算起,0-6
    int tm_yday;    // 從今年1月1日到目前的天數,范圍0-365
    int tm_isdst;    // 日光節約時間的旗標
};

常用的時間庫函數

常用的時間函數都包含在頭文件 time.h/ctime(C/C++ 版本)中。

time()

time_t time(time_t *ptr);

該函數返回得到當前日歷時間或者設置日歷時間,日歷時間即自格林威治時間(1970-01-01 00:00:00 UTC)起經過的時間,單位為秒。ptr 是一個指向類型為 time_t 對象的指針。如果 ptr 不為空,則返回值存儲在變量 ptr 中。一般給 ptr 傳遞0或者 NULL 值,如果傳遞的是非空地址,也能得到當前的日歷時間。

time_t t1 = time(0);
time_t t2 = time(NULL);
// 等價語句,三個對象存儲的都是同一個數值
time_t t3;
time(&t3);

asctime()

char *asctime(const struct tm *timeptr);

該函數接受一個指向 tm 結構類型常量對象的指針 timeptr,返回一個指向字符串的指針,該字符串包含了可讀格式的日期和時間信息 :

w m d h:m:s y

其中,w 表示星期幾,m 是以字母表示的月份,d 表示一月中的第幾天,h : m : s 表示當前的時間,y 表示年份。asctime 函數常用于將結構中的信息轉換為真實世界的時間,以字符串的形式顯示。它計算得到的是世界統一時間。世界統一時間比北京時間早八個小時。比如當前北京時間是 8:41,利用 asctime 顯示的時間則為 00:41,這意味著日期也有可能會早一天。

gmtime()

struct tm *gmtime(const time_t *timer);

該函數接受一個指向 time_t 類型常量對象的指針 timer,返回一個指向 tm 結構類型的指針。它使用 timer 的值來計算 tm 的各個成員變量,得到的是協調世界時。

ctime()

char *ctime(const time_t *timeptr);

該函數接受一個指向 time_t 類型常量對象的指針 timeptr,返回一個指向字符串的指針,其與 asctime() 的返回類型和格式是一樣的。這兩個函數的區別在于傳入的參數類型不一樣,而且 ctime 返回的是本地時區時間。

localtime()

struct tm *localtime(const time_t *timer);

該函數接受一個指向 time_t 類型常量對象的指針 timer,返回一個指向 tm 結構類型的指針。它使用 timer 的值來計算 tm 的各個成員變量,得到的是“本地時區時間”。

mktime()

time_t mktime(struct tm *timeptr)

該函數接受一個指向 tm 結構類型常量對象的指針 timeptr,返回一個 time_t 類型的無符號整數。它的作用是將 timeptr 所指向的結構體變量轉換成自格林威治時間(1970-01-01 00:00:00 UTC)起經過的時間并返回,單位為秒,若發生錯誤返回-1。

strftime()
size_t strftime(
    char *str,
    size_t maxsize,
    const char *format,
    const struct tm *timeptr);

該函數接受一個字符串str、一個無符號整數 maxsize,一個字符串 format 以及一個指向 tm 結構類型常量對象的指針。它的作用是將 timeptr 表示的時間按照格式化規則存儲在 str 中,maxsize 用來表示復制到 str 中的最大字符個數。如果 str 的字符個數(包含空字符 ‘\0’)小于 maxsize,則函數返回其字符個數,否則返回0。

size_t 是一個與機器相關的無符號整數類型,其大小足以保證存儲內存中的任意對象。例如數組下標的類型、vector 下標的類型實際上都是 size_t。

format 是一個 C 字符串,其中包含了普通字符和特殊格式說明符的任何組合。這些格式說明符由 strftime 函數識別,從而將 tm 中每個成員變量(參考前面 tm 結構中定義的各個整數)替換為相應的格式并存入 str 中。下表為格式說明符:

說明符 替換為
%a 縮寫的星期幾名稱,例如:Sun
%A 完整的星期幾名稱,例如:Sunday
%b 縮寫的月份名稱,例如:Mar
%B 完整的月份名稱,例如:March
%c 日期和時間表示法,例如:Sun Aug 19 02:56:02 2012
%d 一月中的第幾天(01-31),例如:19
%F 顯示年-月-日,例如:09-11-03
%H 24 小時格式的小時(00-23),例如:14
%I 12 小時格式的小時(01-12),例如:05
%j 一年中的第幾天(001-366),例如:231
%m 十進制數表示的月份(01-12),例如:08
%M 十進制表示的分鐘數(00-59),例如:55
%p AM 或 PM 名稱,例如:PM
%r 12小時的時間,例如:9
%R 小時和分鐘,例如:08:29
%S 秒(00-61),例如:02
%U 一年中的第幾周,以第一個星期日作為第一周的第一天(00-53),例如:33
%w 十進制數表示的星期幾,星期日表示為 0(0-6),例如:4
%W 一年中的第幾周,以第一個星期一作為第一周的第一天(00-53),例如:34
%x 標準日期串,例如:08/19/12
%X 標準時間串,例如:02:50:06
%y 年份的最后兩個數字(00-99),例如:01
%Y 完整的年份,例如:2012
%Z 時區的名稱或縮寫,若得不到時區名稱則返回空串,例如:CDT
%% 一個 % 符號,例如:%

difftime()

double difftime(time_t time1, time_t time2)

該函數接受兩個 time_t 類型的無符號整數并返回它們的差值,單位為秒。

C/C++ 獲取當前(本地)時間的方法

方法一

先獲取格林威治時間,再使用 localtime 函數獲取當前時間的 tm 結構類型變量,將其格式化后存入 str 再打印:

#include <cstdio>
#include <ctime>

int main(void)
{
    time_t t = time(0);
    char str[64];
    strftime(str, sizeof(str), "%Y/%m/%d %X %A 今年第%j天 %z", localtime(&t));
    printf("當前時間:%s", str);

    return 0;
}

方法二

先獲取格林威治時間,使用 localtime 函數獲取當前時間的 tm 結構類型變量,再將其用 ctime 函數轉換成當前時間的字符串打印輸出:

#include <cstdio>
#include <ctime>

int main(void)
{
    time_t t = time(0);
    struct tm *info = localtime(&t);

    printf("當前時間:%s", ctime(info));

    return 0;
}

方法三

先獲取格林威治時間,使用 localtime 函數獲取當前時間的 tm 結構類型變量,然后直接依據 tm 中的成員來計算我們想要打印的內容:

#include <cstdio>
#include <ctime>

int main()
{
    char wday[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t t = time(0);     // 獲得time_t結構的時間,世界協調時
    struct tm *p;

    p = localtime(&t);      // 轉換為 struct tm 結構的本地時間
    printf("%04d/%02d/%02d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday);               // 打印當前日期
    printf("%s %02d:%02d:%02d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);    // 打印當前時間

    return 0;
}

方法四

使用 windows 的 API,能夠精確到毫秒級。但是因為用的是 windows 下的函數,所以換了其他操作系統就不一定能用了:

#include <cstdio>
#include <windows.h>

int main()
{
    SYSTEMTIME sys;
    GetLocalTime(&sys);
    printf("%4d-%02d-%02d %02d:%02d:%02d.%03d 星期%1d",
           sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);

    return 0;
}

方法五

利用系統函數,只顯示當前的時間,不顯示年月日這些。而且還能直接修改系統時間:

#include <cstdlib>

int main()
{
    system("time");

    return 0;
}

原文鏈接:https://blog.csdn.net/qq_37701948/article/details/127652884

欄目分類
最近更新