| 時間格式:DosDateTime <====>FileTime <====> SystemTime ????????????????????| ? ? ????????? |?????????????? | 使用上面??????????LocalFileTime? FileName?? 系統(tǒng)時間和本地時間 格式的時間:??????(本地時區(qū))??? (UTC)???????? ???????????????? ? 一.時間結(jié)構(gòu)體 時間結(jié)構(gòu)體1://文件時間格式 typedef struct _FILETIME { ???DWORD dwLowDateTime; ?///64位的低32位 ???DWORD dwHighDateTime; ///64位的高32位 }FILETIME; (typdefDWORD unsigned long) 說明: ???FILETIME結(jié)構(gòu)是一個表示距離 1601年1月1日00時00分(英國格林威治時間,UTC)為計時起點 的時間間隔數(shù)的64位整數(shù),數(shù)值單位為100ns(納秒) 使用該結(jié)構(gòu)定義出的變量,不能直接用來進行加減運算,應先合成64為整型數(shù),再進行各種數(shù)學運算。如方法一: FILETIME?time; __int64 val64= time.dwHighDateTime<<32 | time.dwLowDateTime; 方法二,使用LARGE_INTEGER結(jié)構(gòu): FILETIME?time1; LARGE_INTEGER time2; time2.LowPart=time1.dwHighDateTime; time2.HighPart=time1.dwHighDateTime; time2.QuadPart;?// __int64 ? 時間結(jié)構(gòu)體2.1: typedef union _LARGE_INTEGER{ ???struct{ ???????LONG LowPart; ///64位整型數(shù)的低32位 ???????LONG HighPart;/// 64位整型數(shù)的高32位 ????}; LONGLONG QuadPart; ///64位整型數(shù) }LARGE_INTEGER; typedef LARGE_INTEGER *PLARGE_INTEGER; ? 時間結(jié)構(gòu)體2.2: ULARGE_INTEGER //一個64位的無符號整型值 The ULARGE_INTEGER structure is used to specify a 64-bit unsigned integer value. //類型定義 typedef union _ULARGE_INTEGER { struct { DWORD LowPart; DWORD HighPart; }; ULONGLONG QuadPart; } ULARGE_INTEGER; Members Specifies the low-order 32 bits. Specifies the high-order 32 bits. Specifies a 64-bit unsigned integer. 時間結(jié)構(gòu)體3://系統(tǒng)時間格式 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; 不要直接對結(jié)構(gòu)體里的成員進行運算。應該: 先從SYSTEMTIME structure轉(zhuǎn)換成FILETIME structure, 再把FILETIME structure轉(zhuǎn)換成LARGE_INTEGER structure 最后LARGE_INTEGER structure轉(zhuǎn)換成64位整型數(shù),才進行加減運算。 ? ? 二.時間格式轉(zhuǎn)換API 1.1用于轉(zhuǎn)換 MS-DOS16位日期和時間值 為 64-bit文件時間格式 BOOLDosDateTimeToFileTime( ???WORD wFatDate,? // 16-bit MS-DOS date ???WORD wFatTime,? // 16-bit MS-DOS time ???LPFILETIME lpFileTime ? // pointer to buffer for 64-bit file time ??);?? 參數(shù): wFatDate,指定16位MS-DOS日期值。各位的代表意義: 位???? 描述 0-4?? 日(1-31) 5-8?? 月(1表January, 2表February,…) 9-15??年,當前距離1980年的年數(shù)(包括1980年) wFatTime,指定16位MS-DOS時間值。各位的代表意義: 位??? 描述 0-4?? 秒 5-10????? 分 (0-59) 11-15?時 (0-23) ? 1.2用于轉(zhuǎn)換 64位文件時間格式 為?MS-DOS日期時間值. BOOLFileTimeToDosDateTime( ???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用于把 文件時間格式 轉(zhuǎn)換成 系統(tǒng)時間格式 BOOLFileTimeToSystemTime( ???CONST FILETIME *lpFileTime, ???LPSYSTEMTIME lpSystemTime ); 返回值: ???成功,則返回TURE; ???失敗,則返回FALSE。To get extended error information, call GetLastError. 注:當FILETIME的值等于或大于0x80000000 00000000,則函數(shù)會失敗。 ? 2.2用于把 系統(tǒng)時間格式 轉(zhuǎn)換成 文件時間格式 BOOLSystemTimeToFileTime( ???CONST SYSTEMTIME *lpSystemTime, ???LPFILETIME lpFileTime ??); ? 3.1///用把 UTC時間 轉(zhuǎn)換為 本地時間 BOOLFileTimeToLocalFileTime( ???CONST FILETIME *lpFileTime, // pointer to UTC file time to convert? ???LPFILETIME lpLocalFileTime // pointer to converted file time ??); 3.2///用把本地時間 轉(zhuǎn)換為 UTC時間 ?BOOLLocalFileTimeToFileTime( ???CONST FILETIME *lpLocalFileTime, // address of local file time to convert ???LPFILETIME lpFileTime ? // address of converted file time ???); ? ? 三.獲得系統(tǒng)時間 獲取當前系統(tǒng)的日期和時間(UTC時間 ) VOIDGetSystemTime( LPSYSTEMTIME lpSystemTime ); ? BOOLSetSystemTime( CONST SYSTEMTIME *lpSystemTime ); ? 獲取當前系統(tǒng)的日期和時間(本地時區(qū) ) VOIDGetLocalTime( LPSYSTEMTIME lpSystemTime ); ? BOOLSetLocalTime( CONST SYSTEMTIME *lpSystemTime ); ? ? #include<time.h> typedef long time_t; //獲得系統(tǒng)時間,從UTC到獲取時刻的秒數(shù) time_ttime( 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轉(zhuǎn)換為tm格式,并是本地時區(qū)的了 structtm *localtime( const time_t *timer );? ? ? 四.獲得指定文件的各項時間 ? ? ? ? 五.獲得線程和進程的各項時間 獲得指定線程的各項時間信息: BOOL WINAPIGetThreadTimes( IN HANDLE????? hThread, OUT LPFILETIMElpCreationTime, OUT LPFILETIMElpExitTime, OUT LPFILETIMElpKernelTime, OUT LPFILETIMElpUserTime ); 參數(shù): lpCreationTime,指向一個FILETIME結(jié)構(gòu)體返回線程被創(chuàng)建時的時間; lpExitTime,?? 指向一個FILETIME結(jié)構(gòu)體返回線程被終止時的時間; lpKernelTime, 指向一個FILETIME結(jié)構(gòu)體返回線程在內(nèi)核模式下執(zhí)行的累計時間; lpUserTime,?? 指向一個FILETIME結(jié)構(gòu)體返回線程在用戶模式下執(zhí)行的累計時間; 返回值: ???成功,則返回TRUE; ???失敗,則返回FALSE。想獲取錯誤代碼,請調(diào)用GetLastError。 ? 獲得進程的各項時間信息: GetProcessTimes是個類似GetThreadTimes的函數(shù),適用于進程中的所有線程: BOOLGetProcessTimes( HANDLE???? hProcess, ??PFILETIME ? pftCreationTime, PFILETIME? pftExitTime, ??PFILETIME ? pftKernelTime, PFILETIME? pftUserTime ); 說明: GetProcessTimes返回的時間適用于某個進程中的所有線程(甚至是已經(jīng)終止運行的線程)。例如,返回的內(nèi)核時間是所有進程的線程在內(nèi)核代碼中經(jīng)過的全部時間的總和 |