FileTime如何转换为Time_t

先说个概念:
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的时间结构体、时间转换及时间获取

如何在C++中将filetime时间转化为字符串?


//********************************************************************/

或是如下方法:

如果编译器中的long类型为4字节时,则 time_t(typedef time_t __int64)

filetime(filetime结构体中有两个unsigned long类型的变量)占用字节大小一样(__int64是有符号吧),则filetime先可以转化为time_t,再由time_t转化为tm:

FILETIME是一个__int64。可以这样转化成__int64



filetime st;


__int64 d = *(__int64 *)&st;

//因为filetime结构体中的两个变量是unsigned long类型的,而*(__int64 *)&st只是表示将unsigned long类型的变量st的数据按照__int64(=longlong)来解释读取而已,并未实际将unsigned long类型的变量st的数据转换成__int64(=longlong)数据类型格式的。

__int64 d *(__int64 *)&st;应该改为__int64 d =(__int64)st;不行,因为编译器一般只存在从基本数据类型到基本数据类型的类型转换函数,而像从复合数据类型到基本数据类型等的类型转换函数一般不存在,即编译器可能不存在从filetime结构体类型到__int64的类型转换函数。


参见:

强制类型转换和隐式类型转换|__int64 d = *(__int64 *)&st;

中的

为什么filetime数据类型的变量st可以通过如下方式正确读取其所要表示的数值:

__int64 d = *(__int64 *)&st?


// or

//__int64 d2;
//memcpy(
& d2, & st, sizeof (d2));

(d -  116444736000000000)  /  10000000

注释:

CRT中的时间(time_t和tm)

Windows中的时间(SYSTEMTIME和FILETIME)

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

参见:

FILETIME SYSTEMTIME tm time_t

CRT中的时间(time_t和tm)

Windows中的时间(SYSTEMTIME和FILETIME)

FILETIME, SYSTEMTIME 与 time_t 相互转换

filetime 转化为 time_t 百度

filetime 时间单位 百度

time_t 时间单位 百度

附加:


补习一下时间单位(http://blog.vckbase.com/zaboli/archive/2005/06/29/8969.aspx)

1ms (毫秒) 1毫秒=0.001秒=10-3秒(millisecond)
1μs (微秒) 1微秒=0.000001=10-6秒(microsecond)
1ns (纳秒) 1纳秒=0.000000001秒=10-9秒(nanosecond)
1ps (皮秒) 1皮秒=0.000000000001秒=10-12秒
1fs (飞秒) 1飞秒=0.00000000000001秒=10-15秒

FILETIME

1功能

FILETIME结构持有的64位无符号的文件的日期和时间值。此值表示自1601年1月1日开始的100纳秒为单位的时间。

2语法

typedef struct _FILETIME {
DWORD dwLowDateTime; /* 低 32 位 */
DWORD dwHighDateTime; /* 高 32 位 */
} FILETIME, *PFILETIME, *LPFILETIME;

3成员

dwLowDateTime
低位32位的文件的时间值。
dwHighDateTime
高位32位的文件的时间值。

4要求

头文件: WINDEF.H[2]



FILETIME是一个__int64。可以这样转化成__int64
__int64 d  =   * (__int64  * ) & st;

// or

__int64 d2;
memcpy(
& d2, & st, sizeof (d2));

转化为__int64是一个以100纳秒为单位的值

参考:

Win32时间类型FILETIME/SYSTEMTIME/WINDOWSTIME(FILETIME这个名字很奇怪,其实他跟FILE并没有直接关系,只是很多File的API中,都以这个为时间的类型)


你可能感兴趣的:(FileTime如何转换为Time_t)