time.h 標頭檔案 是 C 語言中 有關 時間的函數所儲存的標頭檔案
#include <time.h>
在介紹時間函數用法之前,我們首先要了解在 time.h 標頭檔案中已經宣告了的一個結構: struct tm
該結構在time.h 標頭檔案內宣告如下:
#ifndef _TM_DEFINED
#define _TM_DEFINED
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
#endif
該結構內個成員所代表的意思:
struct tm
{
int tm_sec; //秒(0~61)
int tm_min; //分(0~59)
int tm_hour; //小時(0~23)
int tm_mday; //日(1~31)
int tm_mon; //月份(0~11)
int tm_year; //年,從1970年至今經過的年數
int tm_wday; // 星期:(0~6)
int tm_yday; // 天數(0~365)
int tm_isdst; //夏令時 daylight-saving time
}
下面來介紹幾種時間函數的用法:
//函數名稱:
time();
//函數原型:
time_t __cdecl time(time_t *_Time)
{
return _time64(_Time);
}
//函數功能:得到機器的日曆時間或設定日曆時間
//函數返回機器日曆時間
//用法:
引數說明: timer = NULL 時得到機器日曆時間, timer = 時間數值值,用於設定日曆時間, time_t 是一個long 型別
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t timer;
timer = time(NULL);
printf("%ld\n", timer);
}
執行結果是 秒數:
將這個秒數通過時間戳線上轉換網站轉換為年月日,轉換網址為: https://tool.lu/timestamp/ 轉換結果如下
//函數名稱:
localtime();
//函數原型:
struct tm *__cdecl localtime(const time_t *_Time)
{
return _localtime32(_Time);
}
//函數功能: 返回一個以 tm結構表達的機器時間資訊
//函數返回:以 tm 結構表達的時間
//用法:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t timer;
struct tm *tblock;
timer = time(NULL);
tblock = localtime(&timer);
printf("當地時間是 %s", tblock);
}
直接使用 tblock的值 輸出結果是有問題的:
想要獲取日常使用的時間格式 要多使用一個函數:
//函數名稱:
asctime();
//函數原型:
char *__cdecl asctime(const struct tm *_Tm)
//函數功能:獲取機器時間(日期時間轉換成ASCII碼)
//函數返回:返回的時間字串格式為: 星期,月,日,小時:分:秒,年
//用法:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t timer;
struct tm *tblock;
timer = time(NULL);
tblock = localtime(&timer);
printf("當地時間是 %s", asctime(tblock));
}
//另一種用法:
//結合 struct tm 結構
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(void)
{
struct tm t;
char str[80];
t.tm_sec = 1;
t.tm_min = 3;
t.tm_hour = 7;
t.tm_mday = 22;
t.tm_mon = 11;
t.tm_year = 56;
t.tm_wday = 4;
t.tm_yday = 0;
t.tm_isdst = 0;
strcpy(str, asctime(&t));
printf("%s", str);
}
執行結果:
用法1:
用法2:
同樣使用 時間格式輸出時間的還有:
//函數名稱:
ctime();
//函數原型:
char *__cdecl ctime(const time_t *_Time)
{
return _ctime64(_Time);
}
//函數功能:得到日曆時間
//函數返回:返回字串格式: 星期,月,日,小時:分:秒,年
//用法:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t;
time(&t);
printf("當地時間是 %s", ctime(&t));
}
執行結果:
兩次機器時間差的獲取方法:
//函數名稱:
difftime();
//函數原型:double __cdecl difftime(time_t _Time1,time_t _Time2)
//函數功能:得到兩次機器時間差,單位為秒
//函數返回:時間差,單位為秒
//用法:
//引數說明: time1 - 機器時間一, time2 - 機器時間二,該引數應使用 time函數獲得
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main(void)
{
time_t first, second;
first = time(NULL);
Sleep(2000);
second = time(NULL);
printf("兩者之間差了 %f 秒", difftime(second, first));
}
執行結果:
另一個 結構 時間資訊 函數:
//函數名稱:
gmtime();
//函數原型:struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime64(_Time); }
//函數功能:得到以結構 tm 表示的時間資訊
//函數返回:以結構 tm 表示的時間資訊指標
//用法:
//引數說明: t 函數用 time()得到的時間資訊
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main(void)
{
char *tzstr = "TZ = PST8PDT";
time_t t;
struct tm *gmt, *area;
putenv(tzstr);
tzset();
time(&t);
area = localtime(&t);
printf("當地時間是: %s", asctime(area));
gmt = gmtime(&t);
printf("格林尼治時間是: %s", asctime(gmt));
}
執行結果:
上個範例中提到 tzset():
//函數名稱:
tzset();
//函數原型:void __cdecl tzset(void) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
//函數功能:對UNIX作業系統的時間相容性,用於得到時區 在 DOS 環境下無用途
//函數返回:無
//用法:
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main(void)
{
time_t td;
putenv("TZ = PST8PDT");
tzset();
time(&td);
printf("當前時間 = %s", asctime(localtime(&td)));
}
執行結果:
下面來介紹實現 自定義 時間格式輸出函數:
//函數名稱:
strftime();
/*函數原型:size_t __cdecl strftime(char * __restrict__ _Buf,size_t _SizeInBytes,const char * __restrict__ _Format,const struct tm * __restrict__ _Tm);
它有4個引數:
_Buf, 表示返回的時間字串
_SizeInBytes, 要寫入的位元組的最大數量
_Format, 這是 C 字串,包含了普通字元和特殊格式說明符的任何組合。
_Tm, 輸入時間結構體
其中C字串格式符說明如下:
說明符 替換為 範例
%a 縮寫的星期幾名稱 Sun
%A 完整的星期幾名稱 Sunday
%b 縮寫的月份名稱 Mar
%B 完整的月份名稱 March
%c 日期和時間表示法 Sun Jan 23 02:56:02 2022
%d 一月中的第幾天(01-31) 19
%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
%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
%% 一個 % 符號 %
*/
//函數功能:將時間結構體轉換為指定的字串格式
//函數返回:通過指定的字串格式列印出來
//用法:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now_time;
struct tm *info;
char buffer[80];
time( &now_time );
info = localtime( &now_time );
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
printf("格式化的日期和時間 : %s \n", buffer );
}
執行結果:
通過列印的結果可以看出,列印字串的格式和函數中指定的字串格式是一樣的,這樣通過對字串格式的設定,就可按照自己的要求列印出時間和日期的字串,使用起來更加靈活和方便。
關於 C 語言時間函數的用法和特色後續會在陸續補充