最近在写PE分析工具的时候,需要转换TimeDateStamp字段值为日期时间格式,这是Delphi的源码。
//
把GMT时间的秒数转换成日期时间格式
function GetGMTDateTime(Value:Int64):TDateTime;
var
Year,Month,Day:Word;
Hour,Min,Sec,MSec:Word;
iYear,iDay:Word;
iHour,iMin,iSec:Word;
RInt,i:Integer;
TempDate,TempTime:TDateTime;
begin
// GMT是从1970年1月1日开始计算的,所以把它作为初值
Year: = 1970 ; Month: = 1 ; Day: = 1 ;
Hour: = 0 ; Min: = 0 ; Sec: = 0 ; MSec: = 0 ;
// 计算文件创建的年份
iYear: = Value div ( 365 * 24 * 60 * 60 );
Year: = Year + iYear;
// 计算文件除创建整年份以外还有多少天
iDay: = (Value mod ( 365 * 24 * 60 * 60 )) div ( 24 * 60 * 60 );
// 把闰年的年份数计算出来
RInt: = 0 ;
for i: = 1970 to Year - 1 do
begin
if (i mod 4 ) = 0 then
RInt: = RInt + 1 ;
end;
// 计算文件创建的时间(几时)
iHour: = ((Value mod ( 365 * 24 * 60 * 60 )) mod ( 24 * 60 * 60 )) div ( 60 * 60 );
Hour: = Hour + iHour;
// 计算文件创建的时间(几分)
iMin: = (((Value mod ( 365 * 24 * 60 * 60 )) mod ( 24 * 60 * 60 )) mod ( 60 * 60 )) div 60 ;
Min: = Min + iMin;
// 计算文件创建的时间(几秒)
iSec: = (((Value mod ( 365 * 24 * 60 * 60 )) mod ( 24 * 60 * 60 )) mod ( 60 * 60 )) mod 60 ;
Sec: = Sec + iSec;
// 合并日期和时间
TempDate: = EncodeDate(Year,Month,Day);
TempTime: = EncodeTime(Hour,Min,Sec,MSec);
// 由于闰年的二月份有29天,闰年年份一年有366年天,而平年一年有365天,上面
// 是用365计算的,所以要减去闰年年份多出来的一天
// 最后返回值合并日期和时间到TDateTime类型中
Result: = (TempDate + iDay - RInt) + TempTime;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Temp:TDateTime;
begin
// 708992537为秒数
Temp: = GetGMTDateTime( 708992537 );
// 取出日期
Edit1.Text: = DateToStr(Temp);
// 取出时间
Edit2.Text: = TimeToStr(Temp);
end;
function GetGMTDateTime(Value:Int64):TDateTime;
var
Year,Month,Day:Word;
Hour,Min,Sec,MSec:Word;
iYear,iDay:Word;
iHour,iMin,iSec:Word;
RInt,i:Integer;
TempDate,TempTime:TDateTime;
begin
// GMT是从1970年1月1日开始计算的,所以把它作为初值
Year: = 1970 ; Month: = 1 ; Day: = 1 ;
Hour: = 0 ; Min: = 0 ; Sec: = 0 ; MSec: = 0 ;
// 计算文件创建的年份
iYear: = Value div ( 365 * 24 * 60 * 60 );
Year: = Year + iYear;
// 计算文件除创建整年份以外还有多少天
iDay: = (Value mod ( 365 * 24 * 60 * 60 )) div ( 24 * 60 * 60 );
// 把闰年的年份数计算出来
RInt: = 0 ;
for i: = 1970 to Year - 1 do
begin
if (i mod 4 ) = 0 then
RInt: = RInt + 1 ;
end;
// 计算文件创建的时间(几时)
iHour: = ((Value mod ( 365 * 24 * 60 * 60 )) mod ( 24 * 60 * 60 )) div ( 60 * 60 );
Hour: = Hour + iHour;
// 计算文件创建的时间(几分)
iMin: = (((Value mod ( 365 * 24 * 60 * 60 )) mod ( 24 * 60 * 60 )) mod ( 60 * 60 )) div 60 ;
Min: = Min + iMin;
// 计算文件创建的时间(几秒)
iSec: = (((Value mod ( 365 * 24 * 60 * 60 )) mod ( 24 * 60 * 60 )) mod ( 60 * 60 )) mod 60 ;
Sec: = Sec + iSec;
// 合并日期和时间
TempDate: = EncodeDate(Year,Month,Day);
TempTime: = EncodeTime(Hour,Min,Sec,MSec);
// 由于闰年的二月份有29天,闰年年份一年有366年天,而平年一年有365天,上面
// 是用365计算的,所以要减去闰年年份多出来的一天
// 最后返回值合并日期和时间到TDateTime类型中
Result: = (TempDate + iDay - RInt) + TempTime;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Temp:TDateTime;
begin
// 708992537为秒数
Temp: = GetGMTDateTime( 708992537 );
// 取出日期
Edit1.Text: = DateToStr(Temp);
// 取出时间
Edit2.Text: = TimeToStr(Temp);
end;