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秒
}