一. 基本概念:
■ 时间的分类
◆ 本地时间
◆ 协调世界时间(Coordinated Universal Time ,UTC).也即我们常常说的格林威治时 间.
格林威治时间与本地时间的差值,也就是我们通常说的时差.由于我们这边是北京时间(也称东八区).所有差值是8.
■ 常用类(结构)
● CRT提供的时间
◆ time_t:是ong型.我们一般无法理解这个值表示的意义.必须要进行转化才行.
◆ tm结构定义如下:
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格式的时间,我们可以利用localtime来进行转化.
如果想要进行反向转化(即tm->time_t)就需要使用
time_t mktime(struct tm* timeptr);
另外如果想要将其转化为UTC对应的时间,则需要使用
errno_t gmtime_s(struct tm* _tm,const time_t* time);
● SDK时间.上述两类时间是针对CRT,下面是对应的SDK的两个等价时间
◆ typedef struct _FILETIME
{
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
对应于time_t
◆ typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
对应于tm,但是这里多了最后一项(说明更加精确了)
■ 常用的一些获取及其转化函数
● 获取UTC时间:
Void GetSystemTime( LPSYSTEM lpSystemTime);
● 获取本地时间(即北京时间)
Void GetLocalTime(LPSYSTEM lpSystemTime);
● FILETIME 转为SYSTEMTIME函数
BOOL SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime,
LPFILETIME lpFIleTime);
● SYSTEMTIME转为FILETIME函数
BOOL FileTimeToSystemTime(const FILETIME* lpFileTime,
LPSYSTEMTIME lpSystem);
另外也提供UTC和本地时间互转的两个函数
BOOL LocalFileTimeToFileTime( const FILETIME* lpLocalFileTime,
LPFILETIME lpFileTime);
BOOL FileTimeToLocalFileTime(const FILETIME* lpFileTime,
LPFILETIME lpLocalFileTime);
最后一个就是ULARGE_INTEGER结构,这个结构的定义如下:
typedef union ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
struct {
DWORD LowPart;
DWORD HighPart;
} u;
ULONGLONG QuadPart;
} ULARGE_INTEGER;
这个结构和FILETIME没有很大差别,主要是前者32为对齐,后者64位对齐,若要进行转化,则必须要进行赋值操作.
一些简单的参考代码:
CTime ct = CTime::GetCurrentTime();
//
time_t tt = ct.GetTime();
//
tm *pt = localtime( &tt );
// CString strTime;
// strTime.Format( "%d-%d-%d %d:%d:%d",pt->tm_year + 1900,pt->tm_mon + 1,pt->tm_mday,pt->tm_hour,pt->tm_min,pt->tm_sec );
// MessageBox( strTime );
// SYSTEMTIME stUTC,stLocal;
// GetSystemTime( &stUTC );
// GetLocalTime( &stLocal );
HANDLE hFile = CreateFile( "C:\\ysl.txt",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_READONLY,NULL );
FILETIME ftCreate,ftAccess,ftWrite,ftLocal;
SYSTEMTIME st;
GetFileTime( hFile,&ftCreate,&ftAccess,&ftWrite );
FileTimeToLocalFileTime( &ftCreate,&ftLocal );
FileTimeToSystemTime( &ftLocal,&st );
ULARGE_INTEGER uli;
uli.HighPart = ftLocal.dwHighDateTime;
uli.LowPart = ftLocal.dwLowDateTime;
CString strTime;
strTime.Format( "%d",uli.QuadPart );
MessageBox( strTime );
/*
strTime.Empty();
strTime.Format( "%d-%d-%d %d:%d:%d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond );
MessageBox( strTime );
*/