1. 程式人生 > 其它 >VC中多種方式獲取本地當前時間

VC中多種方式獲取本地當前時間

時間資訊是開發過程中常用到的基本資訊,尤其是系統的本地當前時間。獲取系統本地當前時間的途徑較多,這裡儘量採用多種方式,供大家選擇。

1、利用API函式獲取本地當前時間

獲取當前時間的API函式是GetLocalTime(),它的宣告如下:

void WINAPI GetLocalTime(

__out LPSYSTEMTIME lpSystemTime

);

引數:

lpSystemTime

指向SYSTEMTIME結構體的指標,用於接收當前本地日期和時間。

SYSTEMTIME結構體的宣告如下:

typedef struct _SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME, *PSYSTEMTIME;

成員介紹

wYear

年,有效範圍是1601到30827。

wMonth

月,有效範圍是1到12,分別對應1-12月。

wDayOfWeek

表示一週中的一天,即平常我們所說的星期幾,該成員可以是下列值之一:

0為星期天

1為星期一

2為星期二

3為星期三

4為星期四

5為星期五

6為星期六

wDay

日,這個成員的有效範圍是1到31。

wHour

時, 這個成員的有效範圍是0到23。

wMinute

分,這個成員的有效範圍是0到59。

wSecond

秒,這個成員的有效範圍是0到59。

wMilliseconds

毫秒,這個成員的有效範圍是0到999。

2、C語言執行庫函式獲取本地當前時間

(1)、strdate()

將當前系統日期複製到緩衝區。

char *_strdate(

char *datestr

);

(2)、_strtime()

將當前系統時間複製到緩衝區。

char *_strtime(char *timestr);

(3)、localtime()等

將時間值轉換為當地時區的正確值。

struct tm *localtime(const time_t *timer);

struct tm *_localtime32(const __time32_t *timer);

struct tm *_localtime64(const __time64_t *timer);

_localtime32表示截止UTC時間2038年1月19日03:14:07的日期,與localtime等效。

_localtime64使用__time64_t結構,允許表示日期到3000年12月31日23:59:59,協調世界時(UTC)。

引數:

timer

time_t為老的32位時間,一個長整數,代表時間值。

time_t 與__time32_t等效。

__time64_t為__int64型別的整數,代表時間值。

返回值:

返回值為tm結構體型別,它的成員如下:

tm_sec

秒,有效範圍是0 - 59。

tm_min

分,有效範圍是0 - 59。

tm_hour

時,有效範圍是0 - 23。

tm_mday

日,有效範圍是1 - 31。

tm_mon

月,有效範圍是0 – 11,一月為0,二月為1……

tm_year

年,當前年份減去1900年。

tm_wday

星期幾,有效範圍是0 – 6,星期天月為0,星期一為1……

tm_yday

一年中的哪一天,有效範圍是0 – 365,一月1日為0,一月2日為1……

tm_isdst

正值,如果夏令時有效; 如果夏令時不生效,則為0;;如果夏時制的狀態未知,則為負值。 如果設定了TZ環境變數,那麼C執行時庫將假定適用於美國的規則來實現計算夏令時。

(4)、time()等

獲取系統時間。

time_t time(time_t *timer);

__time32_t _time32(__time32_t *timer);

__time64_t _time64(__time64_t *timer);

引數:

timer

指向時間儲存位置的指標。

返回值:

返回從1970年1月1日午夜開始經過的秒數,或者在發生錯誤的情況下返回-1。

3、MFC CTime類獲取本地當前時間

(1)、GetCurrentTime()

返回一個表示當前時間的CTime物件。

static CTime WINAPI GetCurrentTime() throw();

(2)、Format()

返回一個表示當前時間的CTime物件。

CString Format(

LPCTSTR pszFormat

) const;

CString Format(

UINT nFormatID

) const

引數:

pszFormat

類似於printf格式化字串的格式化字串。 前面帶有百分號(%)的格式化程式碼將被相應的CTime元件替換。 格式化字串中的其他字元將原樣複製到返回的字串中。

格式化程式碼列表如下

%a

縮寫工作日的名字。

%A

完整的工作日的名字。

%b

縮寫月的名字。

%B

完整月的名字

%c

特定地區的日期和時間。

%d

月份的哪一天(01 - 31)。

%H

時,24小時制(00 - 23)。

%I

時,12小時制(01 - 12)。

%j

一年中的哪一天(001 - 366)。

%m

月份(01 - 12)。

%M

分鐘(00 - 59)。

%p

當前語言環境的上午/下午 12小時時鐘指示。

%S

秒(00 - 59)。

%U

一年中的第幾周,星期日作為一週的第一天(00 - 53)。

%w

星期(0 – 6,星期天是0) 。

%W

一年中的第幾周,星期一作為一週的第一天(00 - 53) 。

%x

當前區域的日期。

%X

當前區域的時間。

%y

沒有世紀的年份,十進位制數(00 - 99)。

%Y

含世紀的年份十進位制數。

%z, %Z

時區名稱或時區縮寫,取決於登錄檔設定; 如果時區未知,則沒有字元。

%%

百分比符號。

nFormatID

標識這種格式的字串的ID。

返回值:

包含格式化時間的CString。

(3)、GetLocalTm()

獲取一個struct tm值,該struct tm包含此CTime物件中包含的時間的分解。

struct tm* GetLocalTm(struct tm* ptm) const;

引數:

ptm

輸出,指向將接收時間資料的緩衝區。 如果該指標為NULL,則丟擲異常。

結構體tm的用法,參考localtime()函式部分。

返回值:

一個指向包含檔案TIME.H中定義的已填充struct tm的指標。

注意1:GetCurrentTime()是靜態函式,使用時不用建立變數;它是用來獲取本地時間,但它不能獲得含毫秒的值。

注意2:GetLocalTm()不是靜態函式,使用時要建立變數;該函式名含“Local”,但它不是用來獲取本地時間的。

本例的關鍵程式碼如下:

//1、利用API函式獲取當前時間

void CTestDlg::OnBnClickedButton1()

{

SYSTEMTIME st;

GetLocalTime(&st);

CString strRes;

strRes.Format("年:%d\n月:%d\n日:%d\n時:%d\n分:%d\n秒:%d\n毫秒:%d\n星期:%d",

st.wYear,

st.wMonth,

st.wDay,

st.wHour,

st.wMinute,

st.wSecond,

st.wMilliseconds,

st.wDayOfWeek);

MessageBox(strRes);

}

//2、利用C語言執行庫函式獲取當前時間

void CTestDlg::OnBnClickedButton2()

{

//(1)、strdate()

char tmpbuf[9];

_tzset();//設定時區從TZ環境變數獲得。

//如果沒有設定TZ,則通過查詢作業系統獲取預設值 。

_strdate(tmpbuf);

CString strRes1;

strRes1.Format("%s",tmpbuf);

MessageBox(strRes1); //結果為12/10/21,即為2021年12月10日

//(2)、_strtime()

char tbuffer [9];

_strtime(tbuffer);

CString strRes2;

strRes2.Format("%s",tbuffer);

MessageBox(strRes2); //結果為16:26:41,即為16時26分41秒

//(3)、localtime64()

struct tm *newtime;

char am_pm[] = "AM";

__time64_t long_time;

_time64(&long_time); //以64位整數形式獲取時間。

newtime = _localtime64(&long_time ); //轉換為當地時間。

if(newtime->tm_hour > 12)

strcpy_s(am_pm, sizeof(am_pm), "PM");

if(newtime->tm_hour > 12)

newtime->tm_hour -= 12;

if(newtime->tm_hour == 0) //設定小時12如果午夜。

newtime->tm_hour = 12;

char buff[30];

asctime_s(buff, sizeof(buff), newtime);

CString strRes3;

strRes3.Format("%s",buff);

MessageBox(strRes3);

//結果為fri Dec 10 04:39:27 2021,即為2021年12月10日16時39分27秒

}

//3、MFC CTime類獲取當前時間

void CTestDlg::OnBnClickedButton3()

{

CString strRes1;

CTime CurrentTime = CTime::GetCurrentTime();

strRes1 = CurrentTime.Format("%Z:%Y年%m月%d日%H時%M分%S秒");

MessageBox(strRes1); //結果為2021年12月10日10時37分53秒

struct tm *pTm;

tm rtm;

CTime t=CTime::GetCurrentTime();

//CTime t(1999, 3, 19, 22, 15, 0);

pTm=t.GetLocalTm(&rtm);

CString strRes2;

strRes2.Format("%d年%d月%d日-%d時:%d分:%d秒",

pTm->tm_year+1900,

pTm->tm_mon+1,

pTm->tm_mday,

pTm->tm_hour,

pTm->tm_min,

pTm->tm_sec);

MessageBox(strRes2); //結果為2021年12月10日-10時:37分:58秒

CString strRes3;

strRes3.Format("%d年%d月%d日-%d時:%d分:%d秒",

rtm.tm_year+1900,

rtm.tm_mon+1,

rtm.tm_mday,

rtm.tm_hour,

rtm.tm_min,

rtm.tm_sec);

MessageBox(strRes3); //結果為2021年12月10日-10時:37分:58秒

}

更多資訊