나는 2 개의 유닉스 타임 스탬프를 LONG INT로 가지고있다. 경과 시간을 얻고 hh로 형식을 지정하려면 끝에서 빼기를 원합니다. mm : ss경과 시간을 얻고 형식을 지정하는 방법은 무엇입니까?
어떻게하면됩니까? 감사합니다
나는 2 개의 유닉스 타임 스탬프를 LONG INT로 가지고있다. 경과 시간을 얻고 hh로 형식을 지정하려면 끝에서 빼기를 원합니다. mm : ss경과 시간을 얻고 형식을 지정하는 방법은 무엇입니까?
어떻게하면됩니까? 감사합니다
는 당신이 년, 월 및 일 수 싶어 경우가와 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)]));
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]);
예외적 인 상황이 하루 이상 지속될 이유는 없습니다. 이미 여기에있는 코드보다 다루기가 어렵지 않습니다. 그러나 예외를 던져야하는 경우 int, '% d'표시에 올바른 형식 문자열을 사용해야합니다. 또한'/'연산자를 사용하여 나눌 경우 int가 아닌 float가됩니다. 대신에'div'를 사용하십시오. –
@Rob : re :> 1 day : 첫 번째 버전은 일을 시간 앞에 추가 숫자로 추가했지만 OP는 hh : mm : ss 형식을 원했기 때문에 대신 예외를 던지도록 변경했습니다. 다시 :/당신 말이 맞아, 내가 div를 사용해야합니다. 하지만 크리스마스 때였는데 너무 많이 먹었어요 .-) – dummzeuch
또는 24 시간을 초과하도록 허용 할 수 있습니다. –
이 답변은 내가 찾고 있던 결과를 생성하지 않았다. 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 파일이 필요합니다. 이게 필요한지 알려주세요.
예, 제발, @ArchBrooks. 앞으로 다른 사람들을 도울 수있는 다른 가능성을 주셔서 감사합니다 (+1). – Mawg
안녕하십니까, 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 파일의 이름을 유지해야합니다. 즐기십시오! –
+1 그리고 대답. 감사합니다. – Mawg
입력이 유닉스 시간 인 경우'zzz' 섹션을 표시하지 마십시오. 초만 측정하므로 밀리 초를 포함하면 실제로 갖고 있지 않은 정밀도가 도입됩니다. 또한 경과 시간이 24 시간 이상인지 조심하십시오. –
Rob, 네 말이 맞아. 밀리 초를 생략하는 답을 업데이트하고 년, 월, 일을 표시하는 부분을 추가했다. – RRUZ