热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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


 

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

                    |               |               |

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

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

                

 

一.时间结构体

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

typedef struct _FILETIME {

   DWORD dwLowDateTime;  ///64位的低32

   DWORD dwHighDateTime; ///64位的高32

}FILETIME;

(typdefDWORD unsigned long)

说明:

   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.1:

typedef union _LARGE_INTEGER{

   struct{

       LONG LowPart; ///64位整型数的低32

       LONG HighPart;/// 64位整型数的高32

    };

LONGLONG QuadPart; ///64位整型数

}LARGE_INTEGER;

typedef LARGE_INTEGER *PLARGE_INTEGER;

 

时间结构体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.

时间结构体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文件时间格式

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

  );  

参数:

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日期时间值.

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用于把 文件时间格式 转换成 系统时间格式

BOOLFileTimeToSystemTime(

   CONST FILETIME *lpFileTime,

   LPSYSTEMTIME lpSystemTime );

返回值:

   成功,则返回TURE

   失败,则返回FALSETo get extended error information, call GetLastError.

注:当FILETIME的值等于或大于0x80000000 00000000,则函数会失败。

 

2.2用于把 系统时间格式 转换成 文件时间格式

BOOLSystemTimeToFileTime(

   CONST SYSTEMTIME *lpSystemTime,

   LPFILETIME lpFileTime

  );

 

3.1///用把 UTC时间 转换为 本地时间

BOOLFileTimeToLocalFileTime(

   CONST FILETIME *lpFileTime, // pointer to UTC file time to convert 

   LPFILETIME lpLocalFileTime // pointer to converted file time

  );

3.2///用把本地时间 转换为 UTC时间

 BOOLLocalFileTimeToFileTime(

   CONST FILETIME *lpLocalFileTime, // address of local file time to convert

   LPFILETIME lpFileTime   // address of converted file time

   );

 

 

三.获得系统时间

获取当前系统的日期和时间(UTC时间 )

VOIDGetSystemTime( LPSYSTEMTIME lpSystemTime );

 

BOOLSetSystemTime( CONST SYSTEMTIME *lpSystemTime );

 

获取当前系统的日期和时间(本地时区 )

VOIDGetLocalTime( LPSYSTEMTIME lpSystemTime );

 

BOOLSetLocalTime( CONST SYSTEMTIME *lpSystemTime );

 

 

#include

typedef long time_t;

//获得系统时间,从UTC到获取时刻的秒数

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转换为tm格式,并是本地时区的了

structtm *localtime( const time_t *timer ); 

 

 

四.获得指定文件的各项时间

 

 

 

 

五.获得线程和进程的各项时间

获得指定线程的各项时间信息:

BOOL WINAPIGetThreadTimes(

IN HANDLE      hThread,

OUT LPFILETIMElpCreationTime,

OUT LPFILETIMElpExitTime,

OUT LPFILETIMElpKernelTime,

OUT LPFILETIMElpUserTime

);

参数:

lpCreationTime,指向一个FILETIME结构体返回线程被创建时的时间;

lpExitTime   指向一个FILETIME结构体返回线程被终止时的时间;

lpKernelTime 指向一个FILETIME结构体返回线程在内核模式下执行的累计时间;

lpUserTime   指向一个FILETIME结构体返回线程在用户模式下执行的累计时间;

返回值:

   成功,则返回TRUE

   失败,则返回FALSE。想获取错误代码,请调用GetLastError

 

获得进程的各项时间信息:

GetProcessTimes是个类似GetThreadTimes的函数,适用于进程中的所有线程:

BOOLGetProcessTimes(

HANDLE     hProcess,

  PFILETIME   pftCreationTime,

PFILETIME  pftExitTime,

  PFILETIME   pftKernelTime,

PFILETIME  pftUserTime

);

说明:

GetProcessTimes返回的时间适用于某个进程中的所有线程(甚至是已经终止运行的线程)。例如,返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和


推荐阅读
  • vue使用
    关键词: ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
author-avatar
大家庭方不_402
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有