C/C++獲取當(dāng)前時間的方法總結(jié)(最全)
一、獲取當(dāng)前時間
1.使用C語言標(biāo)準(zhǔn)庫
代碼
#define _CRT_SECURE_NO_WARNINGS //VS中必須定義,否則報錯 #include<ctime> #include<stdio.h> int main() { time_t nowtime; time(&nowtime); //獲取1900年1月1日0點0分0秒到現(xiàn)在經(jīng)過的秒數(shù) tm* p = localtime(&nowtime); //將秒數(shù)轉(zhuǎn)換為本地時間,年從1900算起,需要+1900,月為0-11,所以要+1 printf("%04d:%02d:%02d %02d:%02d:%02d\n", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec); }
結(jié)果:
或者使用安全函數(shù)則不需要定義宏
#include<ctime> #include<stdio.h> int main() { time_t nowtime; time(&nowtime); //獲取1900年1月1日0點0分0秒到現(xiàn)在經(jīng)過的秒數(shù) tm p; localtime_s(&p,&nowtime); //將秒數(shù)轉(zhuǎn)換為本地時間,年從1900算起,需要+1900,月為0-11,所以要+1 printf("%04d:%02d:%02d %02d:%02d:%02d\n", p.tm_year + 1900, p.tm_mon + 1, p.tm_mday,p.tm_hour,p.tm_min,p.tm_sec); }
結(jié)果:
2.使用VS提供的ATL模板庫
代碼:
#include<atltime.h> #include<stdio.h> int main() { CTime time=CTime::GetCurrentTime(); printf("%04d/%02d/%02d %02d:%02d:%02d\n",time.GetYear(),time.GetMonth(),time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond()); }
結(jié)果
3.使用Win API
代碼:
#include<Windows.h> #include<stdio.h> int main() { SYSTEMTIME time; GetLocalTime(&time); printf("%04d/%02d/%02d %02d:%02d:%02d\n", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond); }
結(jié)果:
二、代碼解析
1.time函數(shù)
函數(shù)原型:
time_t time( time_t* _Time //保存時間的參數(shù) )
可以看到,該函數(shù)只需要一個名為time_t的參數(shù)
#define long long time_t
從源代碼可以看到,time_t實則是long long 類型的別名
該函數(shù)的作用就是將1900年1月1日0點0分0秒到當(dāng)前所經(jīng)過的秒數(shù)放在該參數(shù)中
所以想要得到我們想要的年月日時分秒常見格式,還需要將該結(jié)果轉(zhuǎn)換一下
2.localtime函數(shù)
函數(shù)原型
tm* localtime( time_t* _Time )
該函數(shù)的作用就是將秒數(shù)轉(zhuǎn)化為對應(yīng)的年月日,時分秒
需要的參數(shù)正是time函數(shù)返回的結(jié)果,轉(zhuǎn)化后的結(jié)果為tm結(jié)構(gòu)體.就可以通過tm變量獲取想要的內(nèi)容
注意: 如果是在VS環(huán)境下,使用該函數(shù)會報錯,必須定義宏_CRT_SECURE_NO_WARNINGS在最前面
#define _CRT_SECURE_NO_WARNINGS
3.tm結(jié)構(gòu)體
源代碼(中文為我的備注,可能理解有偏差,建議參照英文):
struct tm { int tm_sec; // seconds after the minute - [0, 60] including leap second //一分鐘的第幾秒,從0開始計數(shù) int tm_min; // minutes after the hour - [0, 59] //一小時的第幾分種,從0開始計數(shù) int tm_hour; // hours since midnight - [0, 23] //一天的第幾個小時,從0開始計數(shù) int tm_mday; // day of the month - [1, 31] //一個月的第幾天,從1開始計數(shù) int tm_mon; // months since January - [0, 11] //一年的第幾個月,從0開始計數(shù),即0代表1月,1代表2月 int tm_year; // years since 1900 //從1900年到現(xiàn)在經(jīng)過的年分 int tm_wday; // days since Sunday - [0, 6] //一個星期的第幾天,從0開始計數(shù),即0代表星期一,依次類推 int tm_yday; // days since January 1 - [0, 365] //一年的第幾天,從0計數(shù),0代表第一天,依次類推 int tm_isdst; // daylight savings time flag //夏令時標(biāo)志 };
4.localtime_s函數(shù)
該函數(shù)為對應(yīng)的安全函數(shù),不用定義宏就可以使用
errno_t localtime_s( tm* _Tm, time_t * _Time )
可以看到,該安全函數(shù)需要兩個參數(shù),一個是tm,相當(dāng)于localtime函數(shù)的返回值,另一個是time_t,就是time函數(shù)得到的結(jié)果
5.CTime類
該類是ATL(Active Template Library)模板庫提供的,是微軟提供的,在安裝了VS(Visual studio)之后,并安裝了C++開發(fā)環(huán)境,就能正常使用
該類提供了一個靜態(tài)成員函數(shù),GetCurrentTime,可以獲取當(dāng)前時間并把結(jié)果通過CTime類返回
得到結(jié)果后,可通過其成員函數(shù)得到想要的內(nèi)容,比直接使用C語言庫函數(shù)方便很多
6.GetLocalTime函數(shù)
該函數(shù)為WIn API函數(shù),是windows提供的一個獲取時間的接口,精確度可達(dá)到毫秒
函數(shù)原型:
VOID WINAPI GetLocalTime( LPSYSTEMTIME lpSystemTime );
可以看到,該函數(shù)只需要一個SYSTEMTIME結(jié)構(gòu)體的指針,將獲取到的時間保存到該結(jié)構(gòu)體中,通過該結(jié)構(gòu)體就可以獲得想要的內(nèi)容
結(jié)構(gòu)體原型:
typedef struct _SYSTEMTIME { WORD wYear; //年 WORD wMonth; //月 WORD wDayOfWeek; //一周的第幾天,0為周日,1為周一 WORD wDay; //日 WORD wHour; //時 WORD wMinute; //分 WORD wSecond; //秒 WORD wMilliseconds; //毫秒 } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
到此這篇關(guān)于C/C++獲取當(dāng)前時間的方法總結(jié)(最全)的文章就介紹到這了,更多相關(guān)C++獲取當(dāng)前時間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你學(xué)習(xí)一下C++中的構(gòu)造函數(shù)
構(gòu)造函數(shù)是一種特殊的函數(shù),它用于在創(chuàng)建對象時初始化對象的值。在本文中,我們將學(xué)習(xí)C++的構(gòu)造函數(shù)以及如何使用它們來創(chuàng)建對象,希望對大家有所幫助2023-05-05C語言采用文本方式和二進(jìn)制方式打開文件的區(qū)別分析
這篇文章主要介紹了C語言采用文本方式和二進(jìn)制方式打開文件的區(qū)別分析,有助于讀者更好的理解文本文件與二進(jìn)制文件的原理,需要的朋友可以參考下2014-07-07