一路探索者

导航

 

这里介绍获取世界当前时间(世界基准时间),这里尽量采用多种方式,供大家选择。不过首先要介绍世界时间的概念。

一、世界时间简介

1、早期的世界时间

早期的世界时间是格林尼治标准时间(Greenwich Mean Time,GMT),它是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。

2、当今的世界时间

当今的世界时间是协调世界时(UTC),由于它采用原子钟计时,所以它的精确度很高。1972 年1 月1日,协调世界时(UTC)成为新的世界标准时间。故协调世界时已经替代格林尼治标准时间,成为当今的世界基准时间。

3、格林尼治标准时间仍然在起作用

由于格林尼治标准时间影响深远,它仍然在起作用。Windows中,GMT和UTC没有区别,被统称为系统时间(System Time);在不需要精确到秒的情况下,通常也将GMT 和UTC 视作等同。

4、世界当前时间与北京时间的差距

北京时间位于东八区,则它比世界当前时间大8小时。因此,北京当前时间减去8小时,就等于世界当前时间,反之,世界当前时间加上8小时,就等于北京当前时间。

 

二、多种方式获取世界当前时间

1、利用API函数获取世界当前时间

获取当前世界时间的API函数是GetSystemTime(),它的声明如下:

void WINAPI GetSystemTime(

  __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语言运行库函数获取世界当前时间

gmtime()等

将时间值转换为世界时区的正确值。

struct tm *gmtime(const time_t *timer);

struct tm *_gmtime32(const time32_t *timer);

struct tm *_gmtime64(const __time64_t *timer);

_gmtime64使用__time64_t结构,允许表示日期到UTC时间23:59:59,December 31, 3000, UTC;而_gmtime32只表示日期到UTC时间2038年1月19日03:14:07。 1970年1月1日午夜是这两个函数的日期范围的下限。 

参数:

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运行时库将假定适用于美国的规则来实现计算夏令时。 

(2)、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)、GetAsSystemTime ()

返回一个表示系统时间。 

bool GetAsSystemTime(

   SYSTEMTIME& st

) const throw( );

参数:

St

对SYSTEMTIME结构体的引用,该结构将保存转换后的CTime对象的日期/时间值。

SYSTEMTIME结构体的用法,参考GetSystemTime()部分。

返回值:

如果成功返回TRUE,否则返回FALSE。

 

(2)、GetGmtTm ()

获取一个struct tm表本地时间,该struct tm包含此CTime对象中包含的时间的分解。 

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

参数:

ptm

输出,指向将接收时间数据的缓冲区。 如果该指针为NULL,则抛出异常。

结构体tm的用法,参考localtime()函数部分。

返回值:

一个指向包含文件TIME.H中定义的已填充struct tm的指针。

注意1:GetGmtTm()不能直接获取世界时间,但是它可以将本地当前时间转换为世界时间。

注意2:GetAsSystemTime()函数名含“SystemTime”,但它不是用来获取世界本地时间的。

 

    本例的关键代码如下:

//1、利用API函数获取世界当前时间

void CTestDlg::OnBnClickedButton1()

{

       SYSTEMTIME st;

       GetSystemTime(&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()

{

       time_t timep;

    struct tm *pTm;

    time(&timep);

    pTm = gmtime(&timep);

 

       CString strRes1;

       strRes1.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(strRes1); //结果为2021年12月11日-8时:25分:53秒

 

       struct tm *newtime;

    __int64 ltime;

    char buff[80];

 

    _time64(&ltime); //以64位整数形式获取时间。

    newtime = _gmtime64(&ltime);

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

 

       CString strRes2;

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

       MessageBox(strRes2); 

       //结果为sat Dec 11 08:25:53 2021,即为2021年12月11日8时25分53秒

}

 

//3、MFC CTime类获取世界当前时间

void CTestDlg::OnBnClickedButton3()

{

       CTime time1(CTime::GetCurrentTime());

    tm rtm;

    time1.GetGmtTm(&rtm);

 

    CString strRes1;

    strRes1.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(strRes1);

 

       CTime time2(CTime::GetCurrentTime());

    SYSTEMTIME st;

    time2.GetAsSystemTime(st);

 

       CString strRes2;

       strRes2.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(strRes2);

}

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