2010-12-23 70 views

回答

8

可以使用UnixToDateTimeFormatDateTime功能請參見本樣本

uses 
    DateUtils, 
    SysUtils; 

var 
    StartUnixTime : Int64; 
    EndUnixTime : Int64; 

    StartDateTime : TDateTime; 
    EndDateTime : TDateTime; 
begin 
    try 
    StartUnixTime:=1293062827; 
    EndUnixTime :=1293070000; 

    //option 1 converting both unix times to TDatetime and then subtract 
    StartDateTime:=UnixToDateTime(StartUnixTime); 
    EndDateTime :=UnixToDateTime(EndUnixTime);  
    Writeln(Format('Elapsed time %s',[FormatDateTime('hh:nn:ss',EndDateTime-StartDateTime)])); 

    //option 2 subtract directly and then convert to TDatetime 
    Writeln(Format('Elapsed time %s',[FormatDateTime('hh:nn:ss',UnixToDateTime(EndUnixTime-StartUnixTime))])); 

    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
    Readln; 
end. 

此外,如果你想獲得的年,月,日,你可以使用YearsBetweenMonthsBetween並以這種方式DaysBetween功能。

Writeln(Format('Years %d Months %d Days %d',[YearsBetween(EndDateTime,StartDateTime),MonthsBetween(EndDateTime,StartDateTime),DaysBetween(EndDateTime,StartDateTime)])); 
+0

+1和答案。謝謝 – Mawg 2010-12-23 04:12:23

+1

如果輸入是Unix時間,不要顯示`zzz`部分;它只能測量秒,所以包括毫秒在內的精度是你不具備的。另外,請注意,如果所用時間超過24小時。 – 2010-12-23 04:52:12

+0

Rob,你是對的,我更新了答案,省略了毫秒,並添加了顯示年,月和日的部分。 – RRUZ 2010-12-23 07:56:40

1
UnixTime1 := 123456; 
UnixTime2 := 123460; 

Diff := UnixTime2 - UnixTime1; 
if Diff > 24 * 60 * 60 then 
    raise Exception.CreateFmt('Time difference (%s seconds) is longer than a day.', [Diff]); 
s := Format('%.2d:.%2d:%.2d', [Diff div 60 div 60, (Diff div 60) mod 60, Diff mod 60]); 
1

這個答案並沒有產生我一直在尋找的結果。我選擇使用OvcDate.DateDiff過程來提供我正在尋找的結果。

procedure TBCSJEmpdm.q1CalcFields(DataSet: TDataSet); 
var 
    das, mos, yrs : Integer; 
begin 
    OvcDate.DateDiff(DateTimeToStDate(DataSet.FieldByName('fromd').AsDateTime), 
    DateTimeToStDate(DataSet.FieldByName('tod').AsDateTime), das, mos, yrs);  
    DataSet.FieldByName('das').AsInteger := das; 
    DataSet.FieldByName('mos').AsInteger := mos; 
    DataSet.FieldByName('yrs').AsInteger := yrs; 
end; 

該方法給出兩個日期之間的經過的年,月和日。 OvcDate需要ovc.inc文件。只要讓我知道你是否需要這些。