首頁 > 軟體

C/C++獲取當前時間的方法總結(最全)

2023-03-19 06:03:41

一、獲取當前時間

1.使用C語言標準庫

程式碼

#define _CRT_SECURE_NO_WARNINGS //VS中必須定義,否則報錯
#include<ctime>
#include<stdio.h>
int main()
{
	time_t nowtime;
	time(&nowtime); //獲取1900年1月1日0點0分0秒到現在經過的秒數
	tm* p = localtime(&nowtime); //將秒數轉換為本地時間,年從1900算起,需要+1900,月為0-11,所以要+1
	printf("%04d:%02d:%02d %02d:%02d:%02dn", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
}

結果:

或者使用安全函數則不需要定義宏

#include<ctime>
#include<stdio.h>
int main()
{
	time_t nowtime;
	time(&nowtime); //獲取1900年1月1日0點0分0秒到現在經過的秒數
	tm p;
	localtime_s(&p,&nowtime); //將秒數轉換為本地時間,年從1900算起,需要+1900,月為0-11,所以要+1
	printf("%04d:%02d:%02d %02d:%02d:%02dn", p.tm_year + 1900, p.tm_mon + 1, p.tm_mday,p.tm_hour,p.tm_min,p.tm_sec);
}

結果:

2.使用VS提供的ATL模板庫

程式碼:

#include<atltime.h>
#include<stdio.h>
int main()
{
	CTime time=CTime::GetCurrentTime();
	printf("%04d/%02d/%02d %02d:%02d:%02dn",time.GetYear(),time.GetMonth(),time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());
}

結果

3.使用Win API

程式碼:

#include<Windows.h>
#include<stdio.h>
int main()
{
	SYSTEMTIME time;
	GetLocalTime(&time);
	printf("%04d/%02d/%02d %02d:%02d:%02dn", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
}

結果:

二、程式碼解析

1.time函數

函數原型:

time_t time(
time_t* _Time //儲存時間的引數
)

可以看到,該函數只需要一個名為time_t的引數

#define long long time_t

從原始碼可以看到,time_t實則是long long 型別的別名

該函數的作用就是將1900年1月1日0點0分0秒到當前所經過的秒數放在該引數中

所以想要得到我們想要的年月日時分秒常見格式,還需要將該結果轉換一下

2.localtime函數

函數原型

tm* localtime(
time_t* _Time 
)

該函數的作用就是將秒數轉化為對應的年月日,時分秒

需要的引數正是time函數返回的結果,轉化後的結果為tm結構體.就可以通過tm變數獲取想要的內容

注意: 如果是在VS環境下,使用該函數會報錯,必須定義宏_CRT_SECURE_NO_WARNINGS在最前面

#define _CRT_SECURE_NO_WARNINGS

3.tm結構體

原始碼(中文為我的備註,可能理解有偏差,建議參照英文):

struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second //一分鐘的第幾秒,從0開始計數
    int tm_min;   // minutes after the hour - [0, 59] //一小時的第幾分種,從0開始計數
    int tm_hour;  // hours since midnight - [0, 23] //一天的第幾個小時,從0開始計數
    int tm_mday;  // day of the month - [1, 31] //一個月的第幾天,從1開始計數
    int tm_mon;   // months since January - [0, 11] //一年的第幾個月,從0開始計數,即0代表1月,1代表2月
    int tm_year;  // years since 1900 //從1900年到現在經過的年分
    int tm_wday;  // days since Sunday - [0, 6] //一個星期的第幾天,從0開始計數,即0代表星期一,依次類推
    int tm_yday;  // days since January 1 - [0, 365] //一年的第幾天,從0計數,0代表第一天,依次類推
    int tm_isdst; // daylight savings time flag //夏令時標誌
};

4.localtime_s函數

該函數為對應的安全函數,不用定義宏就可以使用

errno_t localtime_s(
tm*  _Tm,
time_t * _Time
)

可以看到,該安全函數需要兩個引數,一個是tm,相當於localtime函數的返回值,另一個是time_t,就是time函數得到的結果

5.CTime類

該類是ATL(Active Template Library)模板庫提供的,是微軟提供的,在安裝了VS(Visual studio)之後,並安裝了C++開發環境,就能正常使用

該類提供了一個靜態成員函數,GetCurrentTime,可以獲取當前時間並把結果通過CTime類返回

得到結果後,可通過其成員函數得到想要的內容,比直接使用C語言庫函數方便很多

6.GetLocalTime函數

該函數為WIn API函數,是windows提供的一個獲取時間的介面,精確度可達到毫秒

函數原型:

VOID WINAPI GetLocalTime(
LPSYSTEMTIME lpSystemTime
);

可以看到,該函數只需要一個SYSTEMTIME結構體的指標,將獲取到的時間儲存到該結構體中,通過該結構體就可以獲得想要的內容

結構體原型:

typedef struct _SYSTEMTIME {
  WORD wYear; //年
  WORD wMonth; //月
  WORD wDayOfWeek; //一週的第幾天,0為週日,1為週一
  WORD wDay;  //日 
  WORD wHour; //時
  WORD wMinute; //分
  WORD wSecond; //秒
  WORD wMilliseconds; //毫秒
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;

到此這篇關於C/C++獲取當前時間的方法總結(最全)的文章就介紹到這了,更多相關C++獲取當前時間內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com