时间信息是开发过程中常用到的基本信息,尤其是系统的本地当前时间。获取系统本地当前时间的途径较多,这里尽量采用多种方式,供大家选择。
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秒
}
浙公网安备 33010602011771号