一路探索者

导航

 

时间信息是开发过程中常用到的基本信息,尤其是系统的本地当前时间。获取系统本地当前时间的途径较多,这里尽量采用多种方式,供大家选择。

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秒

}

 

posted on 2021-12-23 10:48  一路探索者  阅读(745)  评论(0)    收藏  举报