时间的分类:
Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与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年,在tm的year中,是110。
使用函数:
SYSTEMTIME pst;
GetLocalTime(&pst)
这样就可以使用时间了。
C++时间和windows时间的转化
现在有需求是将time_t和systemtime相互转化(原因是师兄用的是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 );
}