主な問題は、ファイルの最終変更時刻を保持しているように見えます。あなたは、ファイルの時間形式の最終更新時刻を取得するためにLastWriteTime
を呼び出し
function LastWriteTime(const FileName: string): TFileTime;
var
AttributeData: TWin32FileAttributeData;
begin
if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @AttributeData) then
RaiseLastOSError;
Result := AttributeData.ftLastWriteTime;
end;
function UTCFileTimeToSystemTime(const FileTime: TFileTime): TSystemTime;
//returns equivalent time in current locality, taking account of daylight saving
var
LocalFileTime: Windows.TFileTime;
begin
Windows.FileTimeToLocalFileTime(FileTime, LocalFileTime);
Windows.FileTimeToSystemTime(LocalFileTime, Result);
end;
function UTCFileTimeToDateTime(const FileTime: TFileTime): TDateTime;
begin
Result := SystemTimeToDateTime(UTCFileTimeToSystemTime(FileTime));
end;
:私は、次のコードを使用します。次にUTCFileTimeToDateTime
を呼び出して、マシンの現地時間帯を考慮してTDateTime
に変換します。その値をNow
と比較することができます。
フォーマットについては、既にその方法を知っているようです。あなたは基本的なアプローチがうまくいくだけで、詳細を肉付けする必要があります。あなたは2
を期待するとき
FormatDateTime('dd hh:nn:ss', 2.9);
その日の1
を示していると言うコメントで
。問題は、この関数が時間間隔ではなく日付をフォーマットすることです。値2.9
は、経過時間として扱われるのではなく、デルファイ時代の後の絶対日時として扱われます(2.9
)。私はTrunc
とFrac
を使用して、それぞれ日数と日数を取得し、そこから作業します。
Days := Trunc(TimeDiff);
Time := Frac(TimeDiff);
私のコードベースから直接抽出された次のコードは、あなたにいくつかのポインタを与えるかもしれません。入力は秒単位ですが、正しいパスに設定する必要があります。
function CorrectPlural(const s: string; Count: Integer): string;
begin
Result := IntToStr(Count) + ' ' + s;
if Count<>1 then begin
Result := Result + 's';
end;
end;
function HumanReadableTime(Time: Double): string;
//Time is in seconds
const
SecondsPerMinute = 60;
SecondsPerHour = 60*SecondsPerMinute;
SecondsPerDay = 24*SecondsPerHour;
SecondsPerWeek = 7*SecondsPerDay;
SecondsPerYear = 365*SecondsPerDay;
var
Years, Weeks, Days, Hours, Minutes, Seconds: Int64;
begin
Try
Years := Trunc(Time/SecondsPerYear);
Time := Time - Years*SecondsPerYear;
Weeks := Trunc(Time/SecondsPerWeek);
Time := Time - Weeks*SecondsPerWeek;
Days := Trunc(Time/SecondsPerDay);
Time := Time - Days*SecondsPerDay;
Hours := Trunc(Time/SecondsPerHour);
Time := Time - Hours*SecondsPerHour;
Minutes := Trunc(Time/SecondsPerMinute);
Time := Time - Minutes*SecondsPerMinute;
Seconds := Trunc(Time);
if Years>5000 then begin
Result := IntToStr(Round(Years/1000))+' millennia';
end else if Years>500 then begin
Result := IntToStr(Round(Years/100))+' centuries';
end else if Years>0 then begin
Result := CorrectPlural('year', Years) + ' ' + CorrectPlural('week', Weeks);
end else if Weeks>0 then begin
Result := CorrectPlural('week', Weeks) + ' ' + CorrectPlural('day', Days);
end else if Days>0 then begin
Result := CorrectPlural('day', Days) + ' ' + CorrectPlural('hour', Hours);
end else if Hours>0 then begin
Result := CorrectPlural('hour', Hours) + ' ' + CorrectPlural('minute', Minutes);
end else if Minutes>0 then begin
Result := CorrectPlural('minute', Minutes);
end else begin
Result := CorrectPlural('second', Seconds);
end;
Except
Result := 'an eternity';
End;
end;
+1特に夏時間を考慮する場合。 –
ありがとう!しかし、まだ何かが間違っています... 'FormatDateTime( 'dd hh:nn:ss'、TimeDiff);' TimeDiff = '2.9487917361'(最後のmodifと現在のファイルの間でほぼ3日間)' 01 22:46:15 ' – TheDude
最新の更新が役立つことを願っています。 –