呵呵,楼上说的TTimeStamp,不太明白的说,还请举例说明。
早晨心情好,重写了一个,应该比较好了,上面的例子都通过了,你再试试。
function De2DateTime(Const St,Et :TDateTime):String;
const
Fmt = '相差 %d 年 %d 月 %d 日 %d 小时 %d 分 %d 秒 %d 毫秒';
var
//以下变量,S开始的为开始时间,E开始的为结束时间。
SYear,EYear,
SMonth,EMonth,
SDay,EDay:Word;
SHour,EHour,
SMin,EMin,
SSec,ESec,
SMSec,EMSec:Word;
EDate:TDateTime;//起、至数据,只是传入参数不是Var的,做中间变量用。
DYear,DMonth,DDay,DHour,DMin,DSec,DMSec:Integer;//时差。
I:Integer;//中间变量,记录时差间隔。
//中间过程,初始变量。
procedure InitVars;
begin
DeCodeDate(EDate,EYear,EMonth,EDay);
DeCodeTime(EDate,EHour,EMin,ESec,EMSec);
end;
begin
if St > Et then //参数出错。
begin
Result := 'Error!';
Exit;
end;
//变量初始化。
// DYear:=0 ;DMonth:=0;DDay:=0;DHour:=0;DMin:=0;DSec:=0;DMSec:=0;
EDate := Et;
DeCodeDate(St,SYear,SMonth,SDay);
DeCodeTime(St,SHour,SMin,SSec,SMSec);
InitVars;
//进位的加减。从最低位开始!
//先来毫秒位:
DMSec := EMSec - SMSec;//取毫秒位差
if DMSec < 0 then //不足应该借位
begin
DMSec := 1000 + DMSec;
EDate := IncSecond(EDate,-1);//借位。
InitVars;//改变量。
end;
DSec := ESec - SSec ;//取秒位差
if DSec < 0 then
begin
DSec := 60 + DSec;
EDate := IncMinute(EDate,-1);
InitVars;
end;
DMin := EMin - SMin;//取分钟差
if DMin < 0 then
begin
DMin := 60 + DMin;
EDate := IncHour(EDate,-1);
InitVars;
end;
DHour := EHour - SHour;//取小时差
if DHour < 0 then
begin
DHour := 24 + DHour;
EDate := IncDay(EDate,-1);
InitVars;
end;
//**********************************************
//改:
DDay := EDay - SDay;//取天差,这里就复杂了!
if DDay < 0 then
begin
DDay := DaysInMonth(SDay) - SDay + EDay;//到月底,再加
EDate := IncMonth(EDate,-1);
InitVars;
end;
{ 原先的是错的
******************************************
DDay := EDay - SDay;//取天差,这里就复杂了!
if DDay < 0 then
begin
while DDay < 0 do
begin
i:= DaysBetween(EDate , IncMonth(EDate,-1));//取当月天数
DDay := i + DDay;
EDate :=IncMonth(EDate,-1);
end;
InitVars;
end;
***************************************
}
DMonth := EMonth - SMonth ;
if DMonth < 0 then
begin
DMonth := 12 + DMonth;
EDate := IncYear(EDate,-1);
InitVars;
end;
DYear := EYear - SYear;
if DYear < 0 then
begin
Result := 'Error!';
Exit;
end;
//结果!
Result := Format(Fmt,[DYear,DMonth,DDay,DHour,DMin,DSec,DMSec]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
t1,t2:TDateTime;
begin
T1:=StrToDateTime('2002-01-31 20:59:59.540');
T2:=StrToDateTime('2002-2-11 19:00:00.001');
ShowMessage(De2DateTime(T1,T2));
end;