gpt4 book ai didi

delphi - 德尔福中的经过/时间间隔?

转载 作者:行者123 更新时间:2023-12-03 15:20:22 27 4
gpt4 key购买 nike

我需要计算现在文件的上次修改日期/时间之间耗时(格式良好),ie. something like this ,仅就我而言,差异可能是几天、几个月甚至几年。

我尝试过这个:

var
TimeDiff : Double;
begin
TimeDiff := Now - FileAgeEx('C:\my-file.txt');
if (TimeDiff >= 1) then
Caption := FormatDateTime('dd hh:nn:ss', TimeDiff)
else
Caption := FormatDateTime('hh:nn:ss', TimeDiff);
end;

但是(1)它不起作用,(2)我想要更好的格式。

最终我的目标是拥有这样的东西:

  • 时差 < 1 天 ==> 显示:12:00:01
  • 时间差异 >= 1 天 ==> 显示:25 天,12:00:01
  • 时间差异 >= 1 年 ==> 显示:2 年、3 个月、10 天、12:00:01

有人知道我该怎么做吗?

谢谢!

最佳答案

主要问题似乎是获取文件的最后修改时间。我使用以下代码:

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;

您调用LastWriteTime来获取文件时间格式的上次修改时间。然后调用UTCFileTimeToDateTime转换为占机器当前本地时区的TDateTime。然后您可以将该值与Now进行比较。

关于格式设置,您似乎已经知道如何做到这一点。您的基本方法将会起作用,您只需要充实细节即可。

<小时/>

在评论中你这么说

FormatDateTime('dd hh:nn:ss', 2.9);

显示 1 表示您期望 2 的日期。问题在于该函数格式化日期而不是时间间隔。值 2.9 不被视为耗时,而是被视为绝对日期/时间,即 Delphi 纪元之后的 2.9 天。我将使用 TruncFrac 分别获取天数和天数的一部分,然后从那里开始工作。

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;

关于delphi - 德尔福中的经过/时间间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10564741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com