Windows API的时间结构体、时间转换及时间获取
时间格式:DosDateTime <====> FileTime <====> SystemTime
| | |
使用上面 LocalFileTime FileName 系统时间和本地时间
格式的时间: (本地时区) (UTC)
一.时间结构体
时间结构体1:// 文件时间格式
typedef struct _FILETIME {
DWORD dwLowDateTime; ///64位的低32位
DWORD dwHighDateTime; ///64位的高32位
} FILETIME;
说明:
FILETIME结构是一个表示距离 1601年1月1日00时00分(英国格林威治时间,UTC)为计时起点 的时间间隔数的64位整数,数值单位为100ns(纳秒)
使用该结构定义出的变量,不能直接用来进行加减运算,应先合成64为整型数,再进行各种数学运算。如方法一:
FILETIME time;
__int64 val64= time.dwHighDateTime<<32 | time.dwLowDateTime;
方法二,使用LARGE_INTEGER结构:
FILETIME time1;
LARGE_INTEGER time2;
time2.LowPart=time1.dwHighDateTime;
time2.HighPart=time1.dwHighDateTime;
time2.QuadPart; // __int64
时间结构体2:
typedef union _LARGE_INTEGER{
struct{
LONG LowPart; ///64位整型数的低32位
LONG HighPart;/// 64位整型数的高32位
};
LONGLONG QuadPart; ///64位整型数
}LARGE_INTEGER;
typedef LARGE_INTEGER *PLARGE_INTEGER;
时间结构体3:// 系统时间格式
typedef struct _SYSTEMTIME{
WORD wYear; /// 年
WORD wMonth; /// 月 。1月份则值为1,2月份则值为2,…..
WORD wDayOfWeek; //// 一星期中的第几天。星期日则值为0,星期一则值为1,….
WORD wDay; /// 日
WORD wHour; /// 时
WORD wMinute; /// 分
WORD wSecond; /// 秒
WORD wMilliseconds; /// 毫秒
} SYSTEMTIME;
不要直接对结构体里的成员进行运算。应该:
先从SYSTEMTIME structure转换成FILETIME structure,
再把FILETIME structure转换成LARGE_INTEGER structure
最后LARGE_INTEGER structure 转换成64位整型数,才进行加减运算。
二.时间格式转换API
1.1用于转换 MS-DOS16位日期和时间值 为 64-bit文件时间格式
BOOL DosDateTimeToFileTime(
WORD wFatDate, // 16-bit MS-DOS date
WORD wFatTime, // 16-bit MS-DOS time
LPFILETIME lpFileTime // pointer to buffer for 64-bit file time
);
参数:
wFatDate ,指定16位MS-DOS日期值。各位的代表意义:
位 描述
0-4 日(1-31)
5-8 月(1表January, 2表February,…)
9-15 年,当前距离1980年的年数(包括1980年)
wFatTime ,指定16位MS-DOS时间值。各位的代表意义:
位 描述
0-4 秒
5-10 分 (0-59)
11-15 时 (0-23)
1.2用于转换 64位文件时间格式 为 MS-DOS日期时间值.
BOOL FileTimeToDosDateTime(
CONST LPFILETIME lpFileTime, // pointer to 64-bit file time
LPWORD lpFatDate, // pointer to variable for MS-DOS date
LPWORD lpFatTime // pointer to variable for MS-DOS time
);
2.1用于把 文件时间格式 转换成 系统时间格式
BOOL FileTimeToSystemTime(
CONST FILETIME *lpFileTime,
LPSYSTEMTIME lpSystemTime );
返回值:
成功,则返回TURE;
失败,则返回FALSE。To get extended error information, call GetLastError.
注:当FILETIME的值等于或大于0x80000000 00000000,则函数会失败。
2.2用于把 系统时间格式 转换成 文件时间格式
BOOL SystemTimeToFileTime(
CONST SYSTEMTIME *lpSystemTime,
LPFILETIME lpFileTime
);
3.1///用把 UTC时间 转换为 本地时间
BOOL FileTimeToLocalFileTime(
CONST FILETIME *lpFileTime, // pointer to UTC file time to convert
LPFILETIME lpLocalFileTime // pointer to converted file time
);
3.2///用把本地时间 转换为 UTC时间
BOOL LocalFileTimeToFileTime(
CONST FILETIME *lpLocalFileTime, // address of local file time to convert
LPFILETIME lpFileTime // address of converted file time
);
三.获得系统时间
获取当前系统的日期和时间( UTC时间 )
VOID GetSystemTime( LPSYSTEMTIME lpSystemTime );
BOOL SetSystemTime( CONST SYSTEMTIME *lpSystemTime );
获取当前系统的日期和时间( 本地时区 )
VOID GetLocalTime( LPSYSTEMTIME lpSystemTime );
BOOL SetLocalTime( CONST SYSTEMTIME *lpSystemTime );
#include
typedef long time_t;
// 获得系统时间,从UTC到获取时刻的秒数
time_t time( time_t *timer );
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转换为tm格式,并是本地时区的了
struct tm *localtime( const time_t *timer );
四.获得指定文件的各项时间
五.获得线程和进程的各项时间
获得指定线程的各项时间信息:
BOOL WINAPI GetThreadTimes(
IN HANDLE hThread,
OUT LPFILETIME lpCreationTime,
OUT LPFILETIME lpExitTime,
OUT LPFILETIME lpKernelTime,
OUT LPFILETIME lpUserTime
);
参数:
lpCreationTime,指向一个FILETIME结构体返回线程被创建时的时间;
lpExitTime , 指向一个FILETIME结构体返回线程被终止时的时间;
lpKernelTime , 指向一个FILETIME结构体返回线程在内核模式下执行的累计时间;
lpUserTime , 指向一个FILETIME结构体返回线程在用户模式下执行的累计时间;
返回值:
成功,则返回TRUE;
失败,则返回FALSE。想获取错误代码,请调用GetLastError。
获得进程的各项时间信息:
GetProcessTimes是个类似GetThreadTimes的函数,适用于进程中的所有线程:
BOOL GetProcessTimes(
HANDLE hProcess,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime
);
说明:
GetProcessTimes返回的时间适用于某个进程中的所有线程(甚至是已经终止运行的线程)。例如,返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和。