• Status: Solved
• Priority: Medium
• Security: Public
• Views: 697

# 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
0
wbstech
1 Solution

Commented:
use now - 180/1440

meikl ;-)
0

Commented:
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

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.
0

Commented:
damn, too slow again ! ;-)
0

Commented:
Btw, I found IncMinute in the DateUtil-Unit of the RxLib !

So, if you have RxLib installed, it is enough to include the DateUtil in your uses-clause.
0

Commented:
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
0

Commented:
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;
0

Commented:
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.
0

Author Commented:
Thanks for the massive amount of detail folks. Didn't expect all that! :-)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.