Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3295609
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类: C/C++

2011-05-25 13:14:26

Windows API的时间结构体、时间转换及时间获取

 

 

时间格式:DosDateTime <====> FileTime <====> SystemTime

                              |   |               |

使用上面           LocalFileTime  FileName   系统时间和本地时间

格式的时间:       (本地时区)    UTC        

                

 

一.时间结构体

时间结构体1// 文件时间格式

typedef struct _FILETIME {

    DWORD dwLowDateTime;  ///64位的低32

    DWORD dwHighDateTime; ///64位的高32

} FILETIME;

说明:

    FILETIME结构是一个表示距离 1601年1月10000(英国格林威治时间,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月份则值为12月份则值为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 ,指定16MS-DOS日期值。各位的代表意义:

      描述

0-4    (1-31)

5-8    (1January, 2February,…)

9-15   年,当前距离1980年的年数(包括1980年)

wFatTime ,指定16MS-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

    失败,则返回FALSETo 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返回的时间适用于某个进程中的所有线程(甚至是已经终止运行的线程)。例如,返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和。
阅读(6101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~