c++和windows中获取时间问题

来源:互联网 发布:mysql列名区分大小写吗 编辑:程序博客网 时间:2024/05/17 02:06

时间的分类:

Coordinated Universal TimeUTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean TimeGMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5

Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时

间。

一般的,都是先获取日历时间,然后转化成我们可以使用的标准时间,本地时间。

标准c++:

包含文件<time.h>

数据结构:

typedef __time64_t time_t;

struct tm{

       int tm_sec;     /* seconds afterthe minute - [0,59] */

       int tm_min;     /* minutes afterthe hour - [0,59] */

       int tm_hour;    /* hours sincemidnight - [0,23] */

       int tm_mday;    /* day of themonth - [1,31] */

       int tm_mon;     /* months sinceJanuary - [0,11] */

       int tm_year;    /* years since1900 */

       int tm_wday;    /* days sinceSunday - [0,6] */

        int tm_yday;    /* days since January 1 - [0,365] */

       int tm_isdst;   /* daylightsavings time flag */

       };

time_t 是一个整数,使用函数:

time_t     tt;

time(&tt)或者tt=time(NULL)

获取从1970年到现在(标准时间)所经过的秒数。注意是标准时间,比如我现在是在东8区,北京时间是19:00,那么获取的时间是到11:00的秒数。如果想获取到本地的时间,加上8*3600=28800即可。

获取秒数后,我们基本上没用,因为我们用的是年月日时分秒的格式。使用函数:

Tm * t;

t=gmtime(&tt);获取标准时间或者

t= localtime(&tt);获取当地时间

这样就能用我们习惯的格式了。

 

Windows

Windows中直接跳过了获取日历时间,直接填充标准时间。

window中,提供了一种和tm类似的数据结构:

typedef struct _SYSTEMTIME{

   WORD wYear;

   WORD wMonth;

   WORD wDayOfWeek;

   WORD wDay;

   WORD wHour;

   WORD wMinute;

   WORD wSecond;

   WORD wMilliseconds;

} SYSTEMTIME,*PSYSTEMTIME, *LPSYSTEMTIME;

优势是多了毫秒,劣势是没有了在一年中的第几天和夏令时(不知道是什么玩意)。

不同的是tm中的year是和1900年的差,比如现在是2010年,在tmyear中,是110

使用函数:

SYSTEMTIME  pst;

GetLocalTime(&pst)

这样就可以使用时间了。

 

 

C++时间和windows时间的转化

现在有需求是将time_tsystemtime相互转化(原因是师兄用的是systemtime,后来我的数据库必须使用time_t,所以才这样,日)。转化方法:

Time_t 转化成 systemtime,方法是time_t -> filetime -> systemtimes

     Time_tt;

     Time(&t);

     t+=28800;//转化为当地时间。

 

     SYSTEMTIME  pst;

     FILETIME ft;

t*=10000000;

     t+=116444736000000000;

     ft.dwLowDateTime= (DWORD) t;

     ft.dwHighDateTime= (DWORD)(t>> 32);

     FileTimeToSystemTime( &ft, &pst );

     cout<<pst.wYear<<"  "<<pst.wMonth<<"  "<<pst.wDay<<"  "<<pst.wHour<<"  "<<pst.wMinute<<"  "<<pst.wSecond<<"  "<<pst.wMilliseconds<<""<<pst.wDayOfWeek<<endl;

 

 

systemtime转化成time_t ,方法是systmetime-> filetime -> time_t

SYSTEMTIME  pst1;

pst1.wYear=2010;

pst1.wMonth=5;

pst1.wDay=12;

pst1.wHour=19;

pst1.wMinute=24;

pst1.wSecond=23;

pst1.wMilliseconds=0;

注意:一般的,我们都是知道年月日,时分秒,毫秒和weekofday是不知道的,weekofday不用初始化,但wMilliseconds一定要初始化为0,否则结果会出错。

 

FILETIME ft1;

SystemTimeToFileTime(&pst1, &ft1);

ULARGE_INTEGER ui;

ui.LowPart = ft1.dwLowDateTime;

ui.HighPart = ft1.dwHighDateTime;

time_t t1;

t1= (LONGLONG)(ui.QuadPart - 116444736000000000) / 10000000;

cout<<t1;

 

 

time_t转化成systemtime

 

void SQLTool::TimetToSystemTime(time_t t,LPSYSTEMTIME pst)

{

     FILETIME ft;

     LONGLONG ll = Int32x32To64(t,10000000) + 116444736000000000;

     ft.dwLowDateTime= (DWORD) ll;

     ft.dwHighDateTime= (DWORD)(ll>> 32);

     FileTimeToSystemTime( &ft, pst );

}

原创粉丝点击