加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi中的经过/时间间隔?

发布时间:2020-12-15 09:38:22 所属栏目:大数据 来源:网络整理
导读:我需要计算从现在到文件的最后修改日期/时间 ie. something like this之间的经过时间(格式很好),仅在我的情况下,差异可以是几天,几个月甚至几年. 我试过这个: var TimeDiff : Double;begin TimeDiff := Now - FileAgeEx('C:my-file.txt'); if (TimeDiff =
我需要计算从现在到文件的最后修改日期/时间 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
> Time Diff> = 1天==>显示:25天,12:00:01
> Time Diff> = 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);

当你想要2时显示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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读