【问题标题】:Elapsed/time interval in Delphi?Delphi中经过/时间间隔?
【发布时间】:2012-05-12 14:49:21
【问题描述】:

我需要计算现在文件的最后修改日期/时间之间经过的时间(格式正确)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) 我想要更好的格式。

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

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

有人知道我该怎么做吗?

谢谢!

【问题讨论】:

    标签: delphi date time vcl


    【解决方案1】:

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

    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 进行比较。

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


    在cmets中你这么说

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

    在您期望2 的那一天显示1。问题是这个函数格式化日期而不是时间间隔。 2.9 的值不被视为经过的时间,而是被视为绝对日期/时间,2.9 Delphi 纪元后的几天。我会使用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;
    

    【讨论】:

    • 谢谢!但是还是有问题...FormatDateTime('dd hh:nn:ss', TimeDiff); where TimeDiff = 2.9487917361(文件上次修改和现在之间几乎有 3 天)给了我01 22:46:15
    • 完美!非常感谢大卫!
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多