这里介绍获取世界当前时间(世界基准时间),这里尽量采用多种方式,供大家选择。不过首先要介绍世界时间的概念。
一、世界时间简介
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(<ime); //以64位整数形式获取时间。
newtime = _gmtime64(<ime);
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);
}
浙公网安备 33010602011771号