Link to home
Start Free TrialLog in
Avatar of wbstech
wbstech

asked on

Delphi 4 : Incrementing the result of 'Now' by a negative amount of minutes

Hello.

I have the below line:

 if (StrToDateTime(QueryNextRun.FieldByName('report_lastrun').AsString) > IncMinute(Now, -180)) then

Which fails to work, as I am using Delphi 4, and I guess IncMinute is in the later versions.

So my question is, how can I achieve the above in Delphi 4?

Just want to compare 2 date/time values, where the 1st comes from a SQL table (Format: dd/mm/yyyy HH:MM:SS) and the second is Now minus about 180 minutes
ASKER CERTIFIED SOLUTION
Avatar of kretzschmar
kretzschmar
Flag of Germany image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of wimmeyvaert
wimmeyvaert

When calculating with date/time, you have the following rule :
1 exact day = 1 (So Now + 1 = tomorrow).

So :
1 day = 1
--> 1 minute = ( 1 / 24 ) / 60 = 6,9444444444444444444444444444444e-4
--> 180 minutes = 6,9444444444444444444444444444444e-4 * 180 = 0,125


In a Delphi Example :

var
  aDate: TDateTime;

  aDate := Now;
  showmessage( FormatDateTime( 'dd/mm/yyyy hh:nn:ss:zzz', aDate ) +
               #13#10 +
               FormatDateTime( 'dd/mm/yyyy hh:nn:ss:zzz', aDate-StrToFloat(Edit5.Text) ) );


This shows you exactly the current date/time and current date/time minus 180 minutes.

So, instead of IncMinute(Now, -180) you can use (Now-0.125)

Best regards,

The Mayor.
damn, too slow again ! ;-)
Btw, I found IncMinute in the DateUtil-Unit of the RxLib !

Didn't know about that function.

So, if you have RxLib installed, it is enough to include the DateUtil in your uses-clause.
In this unit DateUtil.pas there is :

function IncMinute(ATime: TDateTime; Delta: Integer): TDateTime;
begin
  Result := IncTime(ATime, 0, Delta, 0, 0);
end;


and of course also :

function IncTime(ATime: TDateTime; Hours, Minutes, Seconds,
  MSecs: Integer): TDateTime;
begin
  Result := ATime + (Hours div 24) + (((Hours mod 24) * 3600000 +
    Minutes * 60000 + Seconds * 1000 + MSecs) / MSecsPerDay);
  if Result < 0 then Result := Result + 1;
end;

the variable MSecsPerDay = 24 * 60 * 60 * 1000
Or you can make you own IncMinute-Function Like this :

function IncMinute( ATime: TDateTime; Delta: Integer ): TDateTime;
begin
  Result := aDate + ( ( ( 1 / 24 ) / 60) * Delta );
end;
reference for future readers:
NOW (Windows timestamp) is a floating point numeric value with the integer value being the number of days since 1899-12-31 (yyyy-mm-dd format) and the decimal value being a percentage of the date (starting at midnight).

There fractional part of the day is usually displayed down to a one second granularity, but it is accurate down to 1/100 second.

To avoid unnecessary divisions, remember these conversion constants:
86400 - seconds in a day
1440 - minutes in a day
24 - hours in a day (duh)

==================================
If you need a more granular or more reliable timestamp, you would avoid NOW and use a Multi-Media timing value or a Tick timing value.
Avatar of wbstech

ASKER

Thanks for the massive amount of detail folks. Didn't expect all that! :-)