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<time.h>
 
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返回的时间适用于某个进程中的所有线程(甚至是已经终止运行的线程)。例如,返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值