例如,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_t的LONGLONG数据类型
}
//
注释:公元1601年到公元1970年相差369年,转化为秒数即为11644473600秒。
参见:
Windows API的时间结构体、时间转换及时间获取
如何在C++中将filetime时间转化为字符串?
//********************************************************************/
或是如下方法:
如果编译器中的long类型为4字节时,则 time_t(typedef time_t __int64)和
__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的类型转换函数。
为什么filetime数据类型的变量st可以通过如下方式正确读取其所要表示的数值:
__int64 d = *(__int64 *)&st?
注释:
参见:
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秒 |