Когда-то нашел (где-то) формулу, которая вычисляет кол-во дней от начала Григорианского календаря (по-моему, 15.10.1582-пятница).
В реализации на pascal выглядит так (тип real остался, как реликт, когда integer был 2-х байтовым):
Код:
function Size_DateYMD(Ye,Mo,Da : integer) : real;
{"Размер" Даты}
Var
BufY,BufM,BufD : real;
begin
Result:=0;
BufY:=Ye;
BufM:=Mo;
BufD:=Da;
if (Mo>0) and (Mo<=2) then begin
Result := trunc(365*BufY)
+ trunc(BufD)
+ trunc(31*(BufM-1))
+ trunc((BufY-1)/4)
- trunc(3/4*(trunc(BufY-1)/100+1));
end;
if (Mo>2) and (Mo<=12) then begin
Result := trunc(365*BufY)
+ trunc(BufD)
+ trunc(31*(BufM-1))
- trunc(0.4*BufM+2.3)
+ trunc(BufY/4)
- trunc(3/4*(trunc(BufY/100)+1));
end;
end;
Применение примерно такое :
Код:
function Date2ymd_minus_Date1ymd(Ye1,Mo1,Da1, Ye2,Mo2,Da2 : integer) : integer;
{Кол-во дней между датами в формате YMD}
begin
Result:=-1;
if IsDateYMD(Ye1,Mo1,Da1) then begin //дата-1 корректна
if IsDateYMD(Ye2,Mo2,Da2) then begin //дата-2 корректна
if Get_IDDateYMD(Ye1,Mo1,Da1)<=Get_IDDateYMD(Ye2,Mo2,Da2) then begin
//период дат корректен
//Вычисляем кол-во дней между датами
==> Result:=trunc(Size_DateYMD(Ye2,Mo2,Da2) - Size_DateYMD(Ye1,Mo1,Da1));
if Result<0 then begin
Result:=-1;
end;
end;
end;
end;
end;
И т.д.