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

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返回的时间适用于某个进程中的所有线程(甚至是已经终止运行的线程)。例如,返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在BCB6(即Borland C++ Builder 6)中,可以使用TDateTime类型的Now函数来修改系统时间。TDateTime是一个表示日期和时间的类,它可以用于获取当前日期和时间以及进行日期和时间的计算和比较。 要修改系统时间,可以按照以下步骤进行操作: 1. 首先,在代码中包含日期和时间的头文件 #include <DateUtils.h>。 2. 使用Now函数获取当前的日期和时间,将其赋值给TDateTime类型的变量。 例如,可以这样声明一个TDateTime类型的变量,并使用Now函数将当前日期和时间赋值给它: TDateTime currentTime = Now(); 3. 接下来,可以使用TDateTime提供的各种函数和操作来修改系统时间。 例如,可以使用TDateTime的AddSeconds函数向当前时间添加指定的秒数。具代码如下: currentTime = currentTime.AddSeconds(10); 这将把系统时间向后推迟10秒。 4. 最后,可以使用系统API函数来将修改后的时间应用到系统中。调用Windows API函数SetSystemTime来设置新的系统时间。 具代码如下: SYSTEMTIME newTime; DateTimeToSystemTime(currentTime, &newTime); SetSystemTime(&newTime); DateTimeToSystemTime是一个用于将TDateTime对象转换为SYSTEMTIME结构的函数,它将当前时间转换为系统时间的格式。 SetSystemTime函数则使用新的系统时间来设置系统时间。 需要注意的是,修改系统时间可能需要管理员权限,因此在使用这些函数之前,请确保以管理员身份运行程序。此外,在修改系统时间之前,也需要谨慎地检查和验证所进行的操作,以确保安全性和正确性。 ### 回答2: 在BCB6中,要修改系统时间可以使用SetSystemTime函数。 SetSystemTime函数是Windows API中的一个函数,用于设置系统的日期和时间。它接受一个SYSTEMTIME结构参数,该结构包含了要设置的日期和时间信息。 具的函数声明如下: BOOL SetSystemTime(const SYSTEMTIME *lpSystemTime); 在调用这个函数时,需要传入一个SYSTEMTIME结构的指针作为参数。这个结构中包含了年、月、日、时、分、秒等时间信息。 下面是一个示例代码,演示了如何使用SetSystemTime函数来修改系统时间: ```c++ #include <windows.h> int main() { SYSTEMTIME st; // 获取当前系统时间 GetSystemTime(&st); // 修改时间 st.wYear = 2022; st.wMonth = 12; st.wDay = 31; st.wHour = 23; st.wMinute = 59; st.wSecond = 59; // 调用函数设置系统时间 SetSystemTime(&st); return 0; } ``` 以上代码将系统的日期和时间修改为2022年12月31日23时59分59秒。 需要注意的是,修改系统时间可能需要管理员权限。因此,在使用SetSystemTime函数时,需要确保以管理员身份运行程序,或者在程序中调用时获取管理员权限。 ### 回答3: 在BCB6中,可以使用ctime函数来修改系统时间。 ctime函数的功能是将time_t结构时间转换为字符串表示的时间值。它的原型定义如下: ```c char *ctime(const time_t *timer); ``` 在使用ctime函数修改系统时间时,需要先通过time函数获取当前的系统时间,然后将time_t类型的时间转换为字符串时间值,然后对该字符串进行修改,最后通过其他函数将修改后的字符串时间值再转换为time_t类型的时间值,从而实现对系统时间的修改。 具操作步骤如下: ```c #include <time.h> int main() { // 获取当前的系统时间 time_t currentTime = time(NULL); // 将time_t类型的时间转换为字符串时间值 char *strTime = ctime(&currentTime); // 对字符串时间值进行修改 // ... // 将修改后的字符串时间转换为time_t类型的时间值 time_t modifiedTime = mktime(strTime); // 修改系统时间 // ... return 0; } ``` 需要注意的是,在对字符串时间值进行修改时,可以通过字符串处理函数来实现,如strcpy、strcat等。修改系统时间的具步骤可以使用系统相关的函数来完成,如在Windows系统中可以使用SetSystemTime函数来实现。 综上所述,在BCB6中修改系统时间可以使用ctime函数来进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值