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

时间的分类:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值