Windows中的时间(SYSTEMTIME和FILETIME)

Windows时间戳的计算 掌握Windows中FileTime时间戳的手工解析方法,利用WinHex或X-Ways等十六进制编辑器进行手工取证,把Windows中$MFT文件里记载的十六进制时间转化为“年月日时分秒”的可读时间,加深对于时间戳的理解。 阅读详情

上一篇中介绍了C运行库中的时间处理函数。这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。

    当然,首先要弄清楚FILETIME与SYSTEMTIME定义。

   

[cpp]  view plain copy
  1. typedef struct _FILETIME {  
  2.                           DWORD dwLowDateTime;  
  3.                           DWORD dwHighDateTime;  
  4. } FILETIME, *PFILETIME;  
  5. typedef struct _SYSTEMTIME {  
  6.                             WORD wYear;  
  7.                             WORD wMonth;  
  8.                             WORD wDayOfWeek;  
  9.                             WORD wDay;  
  10.                             WORD wHour;  
  11.                             WORD wMinute;  
  12.                             WORD wSecond;  
  13.                             WORD wMilliseconds;  
  14. } SYSTEMTIME, *PSYSTEMTIME;  

    比较一下,很明显,FILETIME与time_t类似,是64位整型,不过FILETIME是以100纳秒(ns)为单位。SYSTEMTIME与tm类似,不过多了一项wMilliseconds。可以看出,SDK时间比CRT的时间提供了更高的精度。同时SDK提供了更丰富的函数来处理时间。

   

[c-sharp]  view plain copy
  1. void GetSystemTime(  
  2.                    LPSYSTEMTIME lpSystemTime);  
  3. void GetLocalTime(  
  4.                   LPSYSTEMTIME lpSystemTime);  

    这两个函数获得SYSTEMTIME形式的当前时间,不过GetSystemTime函数获得当前的UTC时间,GetLocalTime获得当前的本地时间,可以想象,获得的两个时间存在着时差。类似于CRT中提供tm与time_t之间的转换,SDK也提供了两个函数来转换SYSTEMTIME时间与FILETIME时间。

   

[cpp]  view plain copy
  1. BOOL SystemTimeToFileTime(  
  2.                           const SYSTEMTIME* lpSystemTime,  
  3.                           LPFILETIME lpFileTime);  
  4. BOOL FileTimeToSystemTime(  
  5.                           const FILETIME* lpFileTime,  
  6.                           LPSYSTEMTIME lpSystemTime);  

    函数命名很self-explanatory,就不用多说了吧。

    SDK还提供了两个很有趣的函数。

   

[cpp]  view plain copy
  1. BOOL LocalFileTimeToFileTime(  
  2.                              const FILETIME* lpLocalFileTime,  
  3.                              LPFILETIME lpFileTime);  
  4. BOOL FileTimeToLocalFileTime(  
  5.                              const FILETIME* lpFileTime,  
  6.                              LPFILETIME lpLocalFileTime);  

    LocalFileTimeToFileTime函数将本地的FILETIME时间转换为对应的UTC的FILETIME时间。我觉得,这个函数只是通过将本地时间减去与UTC时间的时间差来实现转换,比如在东八区的本地时间转换为对应的UTC时间,只需要将本地时间减去8*60*60*1000*1000*10(单位100ns)。类似,FileTimeToLocalFileTime函数是将UTC时间转换为本地时间,它只是将减去时间差换成加上时间差。

    了解了这些功能,让我们用代码说话吧。

   

[cpp]  view plain copy
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <time.h>  
  4. #include <windows.h>  
  5.   
  6.   
  7. int main()  
  8. {  
  9.     SYSTEMTIME      stLocal, stUTC, stUTC2;  
  10.     FILETIME        ftLocal, ftUTC, ft;  
  11.     ULARGE_INTEGER  uli;  
  12.   
  13.     GetLocalTime(&stLocal);  
  14.     GetSystemTime(&stUTC);  
  15.     printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,  
  16.         stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);  
  17.     printf("UTC System Time  (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,  
  18.         stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);  
  19.   
  20.     SystemTimeToFileTime(&stLocal, &ftLocal);  
  21.     uli.LowPart = ftLocal.dwLowDateTime;  
  22.     uli.HighPart = ftLocal.dwHighDateTime;  
  23.     printf("Local File Time: %llu/n", uli.QuadPart);  
  24.   
  25.     LocalFileTimeToFileTime(&ftLocal, &ftUTC);  
  26.     uli.LowPart = ftUTC.dwLowDateTime;  
  27.     uli.HighPart = ftUTC.dwHighDateTime;  
  28.     printf("UTC File Time: %llu/n", uli.QuadPart);  
  29.   
  30.     FileTimeToSystemTime(&ftUTC, &stUTC2);  
  31.     printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,  
  32.         stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);  
  33.   
  34.     return EXIT_SUCCESS;  
  35. }  

    程序输出结果如下:

    程序输出结果

    代码13行GetLocalTime函数获得当前的本地SYSTEMTIME时间,14行获得对应的UTC的SYSTEMTIME时间,如输出结果前两行所显示,两者相差8小时(凌晨还在写博客,表扬下自己。。。)。

    20行SystemTimeToFileTime函数将本地SYSTEMTIME时间转换为方便计算的本地FILETIME形式时间,如输出结果第三行所显示。

    25行LocalFileTimeToFileTime函数将本地FileTime时间转换为对应的UTC的FILETIME时间,如输出结果第四行所显示。就像前面介绍的,如果你将输出结果第三,四两行所显示的数字相减,并除以10*1000*1000*60*60,你将会得出8,你可以算下试试,记住FILETIME是以100纳秒为单位的。

    最后30行FileTimeToSystemTime将FILETIME时间转换为SYSTEMTIME时间。可以看出输出结果中第五行与第二行相同,这是必须的,因为两者都是当前本地时间对应的UTC时间。

QGIS|如何将WGS84转换为CGCS 2000坐标系? QGIS 3中如何将WGS84转换为国家2000大地坐标系? 今天来回答一位朋友在后台留言提出的问题:怎么将WGS84坐标转换为国家2000大地坐标系。 01工程坐标系 从地图窗口右下角的状态栏可以看到当前地图窗口的坐标系,即工程坐标系(Project CRS)。当前地图可以由多个图层组成,各种来源数据的坐标参照系(Layer CRS)并不一定相同,QGIS在绘制图层之前将根据工程坐标系进行动态坐标转换,然后显示在地图画布中。 因此,在处理空间数据的过程中,一定要特别注意... 阅读详情

相关推荐

别再手动拷贝文件了!用Keil MDK的Pack Installer一键搞定STM32上的RT-Thread Nano移植

本文详细介绍了如何使用Keil MDK的Pack Installer一键快速移植RT-Thread Nano到STM32项目,告别繁琐的手动拷贝和配置过程。通过自动化版本管理和依赖处理,移植时间从47分钟缩短至3分钟,大幅提升开发效率。文章还提供了实战步骤、高级配置技巧和常见问题解决方案,帮助开发者轻松实现RTOS集成。

weixin_29194817的博客 364

C/C++时间相关操作 SYSTEMTIME time_t 字符串的相互转换

****************** 一、 时间相关 ****************** SYSTEMTIME time_t 是长整型,long int tm 是一个结构体 time.h localtime mktime GetLocalTime(&sysTime ); 获取当前时间 SYSTEMTIME类型 CTime t = GetCurrentTime(); MFC

linglinger1999的博客 2万+

复旦微FMQL45T900平台RGMII网口调试实战:从PHY寄存器读取异常到链路建立

本文详细记录了复旦微FMQL45T900平台RGMII网口调试的全过程,重点解决了PHY寄存器读取异常问题。通过电压配置调整、时序优化和硬件信号完整性检查,最终成功建立网络链路。文章提供了实用的调试经验和解决方案,适合嵌入式开发人员参考。

weixin_29193359的博客 288

获取系统时间的几种方法

1.使用system("time")语句: 该方法用于在命令提示符中获取系统当前时间信息(只有时间,没有日期),并提示重新输入时间信息修改当前时间信息 2.利用API函数GetLocalTime 该方法获取当前日期和时间:注意(需要包含windows.h头文件) SYSTEMTIME sys; GetLocalTime(&sys); char szDst[MAX_PATH] = { 0 }; sprintf_s(szDst, MA...

shigzhu的专栏 8340

PostgreSQL中idle in transaction状态的5个隐藏危害及实战解决方案

本文深入剖析了PostgreSQL中`idle in transaction`连接状态的五大隐藏危害,包括内存与锁泄漏、VACUUM受阻导致表膨胀、事务ID加速消耗、连接池资源耗尽以及增加故障排查复杂度。文章提供了基于`pg_stat_activity`视图的监控方法、识别高危事务的SQL脚本,并给出了从数据库参数调优(如设置`idle_in_transaction_session_timeout`)到应用层编码规范与连接池配置的完整实战解决方案。

zzz56的博客 235

BetaFlight开源飞控源码分析

BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码

weixin_43811044的博客 1万+

C++中如何使用SYSTEMTIME获取系统时间并格式化为字符串?

结构体通常与Windows API一起使用来获取系统时间,但直接将其格式化为字符串并不是最直接的方法。通常,更简便和跨平台的方法是使用标准库中的。这个方法更加简洁,并且不需要处理时区转换的复杂性,因为它直接使用了系统本地时间。头文件来处理时间和日期。然而,如果你确实需要使用。

学无止尽,谨言慎行! 1873

告别Modern Standby噩梦:Win11睡眠断网冻结的根源剖析与S3睡眠回归实战

本文深入剖析了Windows 11中Modern Standby(现代待机)模式导致睡眠后断网、系统冻结等问题的根源,指出其与硬件驱动、后台活动的兼容性矛盾。文章提供了通过修改注册表键值强制系统回归稳定S3睡眠状态的详细实战步骤,帮助用户彻底解决睡眠故障,实现可靠的远程访问与挂机任务。

weixin_29210727的博客 609

Windows中的时间(SYSTEMTIME和FILETIME) (转载)

转载:http://blog.youkuaiyun.com/bokee/article/details/5330791 两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIM...

weixin_30481087的博客 137

灵境视界:基于云计算与深度学习的智能手语识别AR眼镜

灵境视界”不仅仅是一款AR眼镜,它代表了未来无障碍沟通设备的发展方向。随着云计算与深度学习技术的不断进步,未来我们将进一步优化识别算法,提升翻译精度,并扩展更多语言和手语类型,为全球听障人士提供更加全面的沟通解决方案。是一款融合了云计算与深度学习技术的增强现实(AR)眼镜,专为听障人士和手语使用者设计。这款眼镜不仅具备先进的AR显示功能,还能实时识别并翻译手语,打破听障人士与健听人士之间的沟通障碍,推动无障碍社会的建设。,让沟通无界,视界无限。

qq_62634009的博客 727

【CANdelaStudio编辑CDD】-1.2-给$10服务SessionControl创建一个新Session会话并修改Session state machine会话状态机(UDS诊断)

前一篇:【UDS诊断描述文件CDD】-1.1-ISO_14229中$10服务理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/120375515案例背景: 在CDD中如何给$10服务创建一个新的Session会话; 在CDD中如何给$10服务修改Session state machine会话状态机。 目录 1 查看$10服务中已有的Session会话​ 2 查看$10服务中已有的Session state machine会话状态机 3 在$10...

「汽车电子助手」的博客 6077

Windows中的时间(SYSTEMTIME和FILETIME)&CRT中的时间(time_t和tm)

地址:http://blog.youkuaiyun.com/bokee/article/details/5330791 上一篇中介绍了C运行库中的时间处理函数。这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEM

wowolook的专栏 4152

AI应用架构师:用RAG解决大模型“幻觉”问题的客服架构设计

在当今的智能客服领域,大语言模型(LLM)凭借流畅的对话能力和强大的理解能力,逐渐取代传统规则式机器人,成为客服系统的核心。但随之而来的“幻觉”问题(即模型编造不存在的信息)却成了致命伤:比如客户问“你们的产品保修期多久”,AI客服可能会自信地回答“3年”,而实际保修期只有1年——这种错误不仅会误导客户,还可能引发投诉、退货甚至法律风险。

AI天才研究院 915

Windows中的时间(SYSTEMTIME和FILETIME) .

上一篇中介绍了C运行库中的时间处理函数。这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(S

sunliangyuan的专栏 1951

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

FILETIME

FILETIME( Windows API 函数 )Windows API应用程序编程接口函数简介Windows API(Windows Application Programming Interface)即:Windows应用程序编程接口;API函数是MicrosoftWindows 32位平台的应用程序编程接口,所有API函数代码放在Windows系统目录下的DLL动态连接库文件中(主要是Kernel32.dll,User32.dll,GDI32.dll,Shell32.dll...);在 Window

The_eagles的专栏 1443

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 荷兰国旗问题、矩阵相乘之Strassen算法
下一篇: string 常用功能封装
小人物2014
博客等级 码龄19年 66粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值