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

    技术2022-05-18  10

    时间的分类:

    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 after the minute - [0,59] */

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

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

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

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

            int tm_year;    /* years since 1900 */

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

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

            int tm_isdst;   /* daylight savings 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_t t;

         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 );

    }


    最新回复(0)