[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]
{
If you are only concerned about dates since 1582, you can translate
both the Current date and the Other date into a LONGINT, and subtract
one from the other.
Below I have a calendar code fragment that writes out the Current
date as a LONGINT. It should be a trivial task to integrate it into
an operational program, and have it do what you want.
{======================[ cut here ]======================}
USES DOS;
CONST DaysPerYear = 365;
TYPE Month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
(* REMEMBER: ORD values for Month are 0..11 - NOT 1..12 ! *)
Date = RECORD
da: 1..31;
mo: Month;
yr: 1..9999
END;
VAR maxDay: ARRAY [Month] OF INTEGER;
daysBefore: ARRAY [Month] OF INTEGER;
PROCEDURE GetSysDate(VAR d: Date);
(* Reads the system clock and assigns the date to d
and the day of the week to dayOfWeek. *)
VAR SysYear,SysMonth,SysDay,SysDOW : word;
BEGIN
GetDate(SysYear,SysMonth,SysDay,SysDOW);
d.yr := SysYear;
d.mo := Month(SysMonth-1);
d.da := SysDay
{ dayOfWeek := DayType(SysDOW+1); }
END;
PROCEDURE MonthsInit;
VAR mo: Month;
BEGIN
maxDay[Jan] := 31;
maxDay[Feb] := 28; (* adjust for leap years later *)
maxDay[Mar] := 31;
maxDay[Apr] := 30;
maxDay[May] := 31;
maxDay[Jun] := 30;
maxDay[Jul] := 31;
maxDay[Aug] := 31;
maxDay[Sep] := 30;
maxDay[Oct] := 31;
maxDay[Nov] := 30;
maxDay[Dec] := 31;
daysBefore[Jan] := 0;
FOR mo := Jan TO Nov DO
daysBefore[Month(ORD(mo)+1)] := daysBefore[mo] + maxDay[mo]
END;
FUNCTION IsLeapYear(Const yr: INTEGER): BOOLEAN;
BEGIN
IsLeapYear := ((yr MOD 4 = 0) AND (yr MOD 100 <> 0)) OR (yr MOD 400 = 0)
END;
FUNCTION NumDays(CONST d: Date): LONGINT;
(* NumDays returns an ordinal value for the date
with January 1, 0001 assigned the value 1. *)
VAR result, leapYears, lYr: LONGINT;
BEGIN
WITH d DO BEGIN
lYr:=yr-1;
result := (da);
INC(result, daysBefore[mo]);
INC(result,lYr * DaysPerYear);
leapYears := (lYr DIV 4) - (lYr DIV 100) + (lYr DIV 400);
INC(result, leapYears);
IF (mo > Feb) AND IsLeapYear(yr) THEN INC(result)
END;
NumDays := result
END;
VAR currentDay : date;
begin
GetSysDate(currentDay);
MonthsInit;
Writeln(NumDays(currentDay));
end.
[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]