2010-12-23 4 views

답변

8

는 당신이 년, 월 및 일 수 싶어 경우가와 FormatDateTime 기능이 샘플 또한

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. 

을 볼 UnixToDateTime 사용할 수 있습니다, 당신은 사용할 수 YearsBetween, MonthsBetween이 방법으로 DaysBetween 기능 .

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

+1 그리고 대답. 감사합니다. – Mawg

+1

입력이 유닉스 시간 인 경우'zzz' 섹션을 표시하지 마십시오. 초만 측정하므로 밀리 초를 포함하면 실제로 갖고 있지 않은 정밀도가 도입됩니다. 또한 경과 시간이 24 시간 이상인지 조심하십시오. –

+0

Rob, 네 말이 맞아. 밀리 초를 생략하는 답을 업데이트하고 년, 월, 일을 표시하는 부분을 추가했다. – RRUZ

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

예외적 인 상황이 하루 이상 지속될 이유는 없습니다. 이미 여기에있는 코드보다 다루기가 어렵지 않습니다. 그러나 예외를 던져야하는 경우 int, '% d'표시에 올바른 형식 문자열을 사용해야합니다. 또한'/'연산자를 사용하여 나눌 경우 int가 아닌 float가됩니다. 대신에'div'를 사용하십시오. –

+0

@Rob : re :> 1 day : 첫 번째 버전은 일을 시간 앞에 추가 숫자로 추가했지만 OP는 hh : mm : ss 형식을 원했기 때문에 대신 예외를 던지도록 변경했습니다. 다시 :/당신 말이 맞아, 내가 div를 사용해야합니다. 하지만 크리스마스 때였는데 너무 많이 먹었어요 .-) – dummzeuch

+1

또는 24 시간을 초과하도록 허용 할 수 있습니다. –

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 파일이 필요합니다. 이게 필요한지 알려주세요.

+0

예, 제발, @ArchBrooks. 앞으로 다른 사람들을 도울 수있는 다른 가능성을 주셔서 감사합니다 (+1). – Mawg

+1

안녕하십니까, OvcDate 및 ovc.inc의 소스 코드는 아래 링크에 포함되어 있습니다. [OvcDate, pas 및 Ovc.Inc] (http://bcsjava.com/blg/wordpress/2015/02/20/bcs-calculating-elapsed-time-delphi/) 다음으로 복사 할 컨트롤을 클릭하십시오. 클립 보드를 클릭 한 다음 원하는 파일에 붙여 넣으십시오. OvcDate에 "ovc.Inc"가 포함되어 있으므로 ovc, inc 파일의 이름을 유지해야합니다. 즐기십시오! –

관련 문제