```Contributor: JAMES MILLER

{Does anyone have any code that takes a minutes figure away from the date
and time ?
The following should do the trick.  note that it Uses a non-TP-standard
date/time Record structure, but you could modify it if you wanted to.

------------------------------------------------------------------------------
}

Interface

Type

timtyp  = Record             {time Record}
hour  : Byte;
min   : Byte;
end;

dattyp  = Record             {date Record}
year : Integer;
mon  : Byte;
day  : Byte;
dayno: Byte;
end;

dttyp   = Record             {date time Record}
time : timtyp;
date : dattyp;
end;

Function adjtime(od : dttyp ; nmins : Integer ; Var nd : dttyp) : Boolean;
{add/subtract nmins to od to give nd}
{return T if day change}

Implementation

{Date/Julian Day conversion routines
Valid from 1582 onwards
from James Miller G3RUH, Cambridge, England}

Const
{days in a month}
monthd  : Array [1..12] of Byte = (31,28,31,30,31,30,31,31,30,31,30,31);

d0 : LongInt = -428; {James defines this as the general day number}

Procedure date2jul(Var dn : LongInt ; dat : dattyp);
{calc julian date DN from date DAT}
Var
m : Byte;

begin
With dat do
begin
m := mon;
if m <= 2 then
begin
m := m + 12;
dec(year);
end;
dn := d0 + day + trunc(30.61 * (m + 1)) + trunc(365.25 * year) +
{the next line may be omitted if only used from Jan 1900 to Feb 2100}
trunc(year / 400) - trunc(year / 100) + 15;
end
end; {date2jul}

Procedure jul2date(dn : LongInt ; Var dat : dattyp);
{calc date DAT from julian date DN}
Var
d : LongInt;

begin
With dat do
begin
d := dn - d0;
dayno := (d + 5) mod 7;
{the next line may be omitted if only used from Jan 1900 to Feb 2100}
d := d + trunc( 0.75 * trunc(1.0 * (d + 36387) / 36524.25)) - 15;
year := trunc((1.0 * d - 122.1) / 365.25);
d := d - trunc(365.25 * year);
mon := trunc(d / 30.61);
day := d - trunc(30.61 * mon);
dec(mon);
if mon > 12 then
begin
mon := mon - 12;
inc(year);
end;
end;
end;  {jul2date}

Function juld2date(jul : Word ; Var jd : dattyp) : Boolean;
{convert julian day  to date}
{ret T if no err}

Var
sum : Integer;
j : LongInt;

begin
if jul > 366 then
begin
juld2date := False;
Exit;
end
else
juld2date := True;
if (jd.year mod 4) = 0 then
monthd[2] := 29
else
monthd[2] := 28;
sum := 0;
jd.mon := 0;
Repeat
inc(jd.mon);
sum := sum + monthd[jd.mon];
Until sum >= jul;
sum := sum - monthd[jd.mon];
jd.day := jul - sum;
date2jul(j,jd);
jul2date(j,jd);
end; {juld2date}

Procedure adjdate(od : dattyp ; ndays : Integer ; Var nd : dattyp);
{add/subtract ndays to od to give nd}

Var
j : LongInt;

begin
date2jul(j,od);
j := j + ndays;
jul2date(j,nd);
end;

Function adjtime(od : dttyp ; nmins : Integer ; Var nd : dttyp) : Boolean;
{add/subtract nmins to od to give nd}
{return T if day change}
Var
emins : Integer;
tnd   : dttyp; {needed in Case routine called With od & nd the same}

begin
tnd := od;
emins := od.time.hour*60 + od.time.min + nmins;
if emins > 1439 then
begin
emins := emins - 1440;
end;
if emins < 0 then
begin