FileTime如何转换为Time_t

本文详细介绍了FILETIME、SYSTEMTIME、tm和time_t四种时间类型,特别是FILETIME如何转换为time_t。FILETIME表示的是从1601年到现在的100纳秒计数,而time_t是从1970年开始的秒数计数。转换过程中需要注意公元1601年到1970年间的秒数差。文中提到了两种转换方法,包括使用ULARGE_INTEGER和直接强制类型转换。同时,文章还讨论了不同类型之间的相互转换以及在Windows API和C Run-Time Library中的时间处理。
摘要由CSDN通过智能技术生成
先说个概念:
Coordinated Universal Time(UTC):又称为世界标准时间;
比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。
Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。日历时间对于不同的编译器,是不同的。
但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。

例如,time_t就是一种日历时间,其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间) 到当前时刻的秒数。


这里面涉及了四个类型  :

*1.FILETIME:结构持有的64位无符号的文件的日期和时间值。此值表示自UTC(Coordinated Universal Time)时间1601年1月1日开始的100纳秒为单位的时间。
*2.SYSTEMTIME:这个和tm有点类似,代表系统时间。其中,SYSTEMTIME.year的值为多少就表示公元哪一年。
*3.tm:Systemtime-1900得到tm.year,其他的还有些差别 tm.year的值加上1900才表示公元哪一年。
*4.time_t:是日历时间;其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间) 到当前时刻的秒数。


FileTime转换为Time_t


//#### FileTimeToTime_t ####
void  FileTimeToTime_t(  FILETIME  ft,  time_t  *t  ) 

 LONGLONG  ll; 
 
 ULARGE_INTEGER            ui; 
 ui.LowPart            =  ft.dwLowDateTime; 
 ui.HighPart            =  ft.dwHighDateTime; 
 
 ll            =  ft.dwHighDateTime  <<  32  +  ft.dwLowDateTime;  //这一步是不是多余的
 
 *t            =  ((LONGLONG)(ui.QuadPart  -  116444736000000000)  /  10000000);

//将ui.QuadPart的数据类型ULONGLONG强制转换为time_tLONGLONG数据类型
}

//


struct {
DWORD LowPart;
DWORD HighPart;
}; 和ULONGLONG QuadPart;组成共用体ULARGE_INTEGER

注释:公元1601年到公元1970年相差369年,转化为秒数即为11644473600秒。

参见:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值