GetSystemTime和GetFileTime

本文介绍了Win32API中关于时间处理的两个函数——GetSystemTime和GetFileTime。GetSystemTime用于获取系统当前时间,而GetFileTime则用于获取文件或目录的创建、访问和修改时间。此外,还提到了FileTimeToSystemTime和SystemTimeToFileTime这两个辅助函数,它们分别用于在FILETIME和SYSTEMTIME结构之间进行转换。

FILETIME结构包含了文件或目录的日期和时间信息:(自1601年1月1日以来,单位为100纳秒)

typedefstruct _FILETIME {

  DWORD dwLowDateTime; //低32位

  DWORD dwHighDateTime; //高32位

} FILETIME, *PFILETIME;

 

SYSTEMTIME结构包含了用户可识别的系统日期信息:

typedefstruct _SYSTEMTIME {

  WORD wYear;

  WORD wMonth;

  WORD wDayOfWeek;

  WORD wDay;

  WORD wHour;

  WORD wMinute;

  WORD wSecond;

  WORD wMilliseconds;

} SYSTEMTIME, *PSY

在 C 语言中,`GetSystemTime` 是 Windows 平台特有的 API,用于获取当前的系统时间。该函数定义在 `<windows.h>` 头文件中,其原型为: ```c void GetSystemTime(LPSYSTEMTIME lpSystemTime); ``` 其中,`SYSTEMTIME` 是一个结构体,用于表示日期时间信息,其定义如下: ```c typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME; ``` ### 底层实现原理 `GetSystemTime` 的底层实现依赖于 Windows 内核提供的系统服务。该函数最终调用的是内核态的 `KeQuerySystemTime` 函数,它从硬件时钟(如 RTC)或系统定时器中获取当前时间戳,并将其转换为本地时间格式填充到 `SYSTEMTIME` 结构中。 该函数的调用流程大致如下: 1. 用户态调用 `GetSystemTime`。 2. 通过 `ntdll.dll` 调用内核态的 `NtQuerySystemTime`。 3. 内核通过 `KeQuerySystemTime` 获取当前时间(通常为 UTC 时间)。 4. 将时间转换为本地时间格式并填充到 `SYSTEMTIME` 结构中。 由于该函数属于 Windows API,其具体实现代码并不公开,但可以通过逆向工程或 Windows DDK 文档进行分析。 ### 示例代码 以下是一个使用 `GetSystemTime` 获取系统时间的简单示例: ```c #include <windows.h> #include <stdio.h> int main() { SYSTEMTIME st; GetSystemTime(&st); printf("Current system time: %04d-%02d-%02d %02d:%02d:%02d.%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); return 0; } ``` 该程序输出当前的系统时间,包括年、月、日、小时、分钟、秒毫秒。 ### 精度与局限性 `GetSystemTime` 的精度通常为毫秒级,但实际精度取决于系统时钟分辨率(通常为 15.6 毫秒)。此外,该函数返回的时间是基于本地时间的,如果系统时间被手动更改或通过 NTP 同步,可能导致时间跳跃或回滚。 在需要更高精度或避免时间回滚的场景中,可以考虑使用 `QueryPerformanceCounter` 或 `GetSystemTimePreciseAsFileTime`(Windows 8 及以上支持)等 API [^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值